[pytango] 04/09: Imported Upstream version 8.1.1~rc1
Frédéric-Emmanuel Picca
picca at moszumanska.debian.org
Thu Nov 28 07:43:04 UTC 2013
This is an automated email from the git hooks/post-receive script.
picca pushed a commit to branch master
in repository pytango.
commit 3a261078e813d43cd26914ee03b73788c795a94e
Author: Picca Frédéric-Emmanuel <picca at debian.org>
Date: Fri Nov 22 20:20:16 2013 +0100
Imported Upstream version 8.1.1~rc1
---
IPython/Extensions/ipy_profile_tango.py | 34 +-
IPython/config/profile/tango/ipython_config.py | 32 +-
PKG-INFO | 4 +-
doc/WINDOWS-COMPILATION-EXAMPLE.TXT | 38 -
doc/_static/banner.png | Bin 427830 -> 0 bytes
doc/_static/banner1.png | Bin 0 -> 335135 bytes
doc/_static/banner2.png | Bin 0 -> 89184 bytes
doc/_static/banner3.png | Bin 0 -> 108825 bytes
doc/_static/boost_python_install.py | 43 +-
doc/_static/green_python.png | Bin 0 -> 603593 bytes
doc/_static/green_python_original.png | Bin 0 -> 1684994 bytes
doc/_static/slideshow.js | 33 +
doc/_templates/index.html | 174 ++++-
doc/_templates/indexsidebar.html | 4 +-
doc/_templates/layout.html | 13 -
doc/api.rst | 3 +
doc/client/index.rst | 4 +-
doc/client/miscellaneous.rst | 290 +++++++-
doc/client/other.rst | 5 +-
doc/conf.py | 77 +-
doc/data_types.rst | 200 +++++
doc/database.rst | 4 +-
doc/encoded.rst | 6 +-
doc/itango/features.rst | 2 -
doc/itango/highlights.rst | 3 +-
doc/itango/index.rst | 5 -
doc/quicktour.rst | 7 +-
doc/revision.rst | 450 ++++++------
doc/server/index.rst | 266 +------
doc/server/server.rst | 109 +++
doc/sphinxext/ipython_console_highlighting.py | 34 +-
doc/start.rst | 390 ++--------
doc/tep/tep-0001.rst | 55 +-
doc/utilities.rst | 3 -
doc/windows_notes.txt | 156 ++++
scripts/itango | 32 +-
scripts/winpostinstall.py | 75 --
setup.py | 505 ++++++-------
src/boost/cpp/api_util.cpp | 28 +-
src/boost/cpp/archive_event_info.cpp | 29 +-
src/boost/cpp/attr_conf_event_data.cpp | 29 +-
src/boost/cpp/attribute_alarm_info.cpp | 29 +-
src/boost/cpp/attribute_dimension.cpp | 28 +-
src/boost/cpp/attribute_event_info.cpp | 29 +-
src/boost/cpp/attribute_info.cpp | 29 +-
src/boost/cpp/attribute_info_ex.cpp | 29 +-
src/boost/cpp/attribute_proxy.cpp | 32 +-
src/boost/cpp/base_types.cpp | 40 +-
src/boost/cpp/base_types_numpy.hpp | 32 +-
src/boost/cpp/callback.cpp | 32 +-
src/boost/cpp/callback.h | 32 +-
src/boost/cpp/change_event_info.cpp | 29 +-
src/boost/cpp/command_info.cpp | 28 +-
src/boost/cpp/connection.cpp | 32 +-
src/boost/cpp/constants.cpp | 191 ++---
src/boost/cpp/data_ready_event_data.cpp | 28 +-
src/boost/cpp/database.cpp | 91 ++-
src/boost/cpp/db.cpp | 72 +-
src/boost/cpp/defs.h | 35 +-
src/boost/cpp/dev_command_info.cpp | 28 +-
src/boost/cpp/dev_error.cpp | 83 ++-
src/boost/cpp/device_attribute.cpp | 35 +-
src/boost/cpp/device_attribute.h | 34 +-
src/boost/cpp/device_attribute_config.cpp | 46 +-
src/boost/cpp/device_attribute_history.cpp | 32 +-
src/boost/cpp/device_attribute_numpy.hpp | 44 +-
src/boost/cpp/device_data.cpp | 39 +-
src/boost/cpp/device_data_history.cpp | 28 +-
src/boost/cpp/device_info.cpp | 28 +-
src/boost/cpp/device_proxy.cpp | 49 +-
src/boost/cpp/enums.cpp | 32 +-
src/boost/cpp/event_data.cpp | 28 +-
src/boost/cpp/exception.cpp | 32 +-
src/boost/cpp/exception.h | 28 +-
src/boost/cpp/fast_from_py.h | 55 +-
src/boost/cpp/fast_from_py_numpy.hpp | 28 +-
src/boost/cpp/from_py.cpp | 28 +-
src/boost/cpp/from_py.h | 32 +-
src/boost/cpp/group.cpp | 28 +-
src/boost/cpp/group_reply.cpp | 28 +-
src/boost/cpp/group_reply_list.cpp | 28 +-
src/boost/cpp/locker_info.cpp | 28 +-
src/boost/cpp/locking_thread.cpp | 28 +-
src/boost/cpp/periodic_event_info.cpp | 29 +-
src/boost/cpp/poll_device.cpp | 28 +-
src/boost/cpp/precompiled_header.cpp | 28 +-
src/boost/cpp/precompiled_header.hpp | 29 +-
src/boost/cpp/pytango.cpp | 32 +-
src/boost/cpp/pytgutils.cpp | 28 +-
src/boost/cpp/pytgutils.h | 28 +-
src/boost/cpp/pyutils.cpp | 32 +-
src/boost/cpp/pyutils.h | 32 +-
src/boost/cpp/server/attr.cpp | 28 +-
src/boost/cpp/server/attr.h | 32 +-
src/boost/cpp/server/attribute.cpp | 34 +-
src/boost/cpp/server/attribute.h | 32 +-
src/boost/cpp/server/command.cpp | 32 +-
src/boost/cpp/server/command.h | 32 +-
src/boost/cpp/server/device_class.cpp | 32 +-
src/boost/cpp/server/device_class.h | 32 +-
src/boost/cpp/server/device_impl.cpp | 57 +-
src/boost/cpp/server/device_impl.h | 32 +-
src/boost/cpp/server/dserver.cpp | 35 +-
src/boost/cpp/server/encoded_attribute.cpp | 31 +-
src/boost/cpp/server/log4tango.cpp | 28 +-
src/boost/cpp/server/multi_attribute.cpp | 28 +-
src/boost/cpp/server/multi_class_attribute.cpp | 28 +-
src/boost/cpp/server/subdev.cpp | 28 +-
src/boost/cpp/server/tango_util.cpp | 67 +-
src/boost/cpp/server/user_default_attr_prop.cpp | 28 +-
src/boost/cpp/server/wattribute.cpp | 123 +++-
src/boost/cpp/server/wattribute_numpy.hpp | 28 +-
src/boost/cpp/tango_numpy.h | 32 +-
src/boost/cpp/tgutils.h | 32 +-
src/boost/cpp/time_val.cpp | 28 +-
src/boost/cpp/to_py.cpp | 28 +-
src/boost/cpp/to_py.h | 32 +-
src/boost/cpp/to_py_numpy.hpp | 28 +-
src/boost/cpp/version.cpp | 28 +-
src/boost/python/__init__.py | 49 +-
src/boost/python/api2.py | 605 ---------------
src/boost/python/api_util.py | 32 +-
src/boost/python/attr_data.py | 70 +-
src/boost/python/attribute_proxy.py | 107 ++-
src/boost/python/base_types.py | 257 ++++++-
src/boost/python/callback.py | 32 +-
src/boost/python/client.py | 18 +
src/boost/python/connection.py | 57 +-
src/boost/python/databaseds/database.py | 772 ++++++++++---------
src/boost/python/databaseds/db_access.py | 216 ++++--
src/boost/python/db.py | 198 ++++-
src/boost/python/device_attribute.py | 32 +-
src/boost/python/device_class.py | 32 +-
src/boost/python/device_data.py | 32 +-
src/boost/python/device_proxy.py | 632 +++++++++++-----
src/boost/python/device_server.py | 32 +-
src/boost/python/encoded_attribute.py | 90 +--
src/boost/python/exception.py | 58 +-
src/boost/python/futures.py | 109 +++
src/boost/python/gevent.py | 109 +++
src/boost/python/globals.py | 32 +-
src/boost/python/green.py | 163 ++++
src/boost/python/group.py | 36 +-
src/boost/python/group_reply.py | 32 +-
src/boost/python/group_reply_list.py | 32 +-
src/boost/python/ipython/__init__.py | 62 +-
src/boost/python/ipython/common.py | 123 +---
src/boost/python/ipython/eventlogger.py | 32 +-
src/boost/python/ipython/ipython_00_10/__init__.py | 32 +-
.../python/ipython/ipython_00_10/ipy_install.py | 32 +-
src/boost/python/ipython/ipython_00_10/ipy_qt.py | 32 +-
.../python/ipython/ipython_00_10/ipython_00_10.py | 40 +-
src/boost/python/ipython/ipython_00_11/__init__.py | 35 +-
.../python/ipython/ipython_00_11/ipy_install.py | 42 +-
.../python/ipython/ipython_00_11/ipython_00_11.py | 45 +-
src/boost/python/ipython/ipython_10_00/__init__.py | 18 +
.../ipy_install.py | 42 +-
.../ipython_10_00.py} | 56 +-
src/boost/python/log4tango.py | 32 +-
src/boost/python/pytango_init.py | 81 +-
src/boost/python/pytango_pprint.py | 32 +-
src/boost/python/pyutil.py | 32 +-
src/boost/python/release.py | 38 +-
src/boost/python/server.py | 817 +++++++++++++++++++++
src/boost/python/tango_futures.py | 43 ++
src/boost/python/tango_gevent.py | 28 +
src/boost/python/tango_numpy.py | 32 +-
src/boost/python/time_val.py | 32 +-
src/boost/python/utils.py | 472 ++++++------
src/sip/AttributeInfo.sip | 102 +++
src/sip/CommandInfo.sip | 119 +++
src/sip/{database.sip => Database.sip} | 32 +-
src/sip/DbData.sip | 12 +
src/sip/DbDatum.sip | 187 +++++
src/sip/DbDevImportInfo.sip | 25 +
src/sip/DbDevInfo.sip | 24 +
src/sip/DeviceAttributeConfig.sip | 38 +
src/sip/DeviceInfo.sip | 24 +
src/sip/DeviceProxy.sip | 221 ++++++
src/sip/Makefile | 58 ++
src/sip/Tango.sip | 47 ++
src/sip/__init_tango.py | 65 ++
src/sip/configure.py | 42 +-
src/sip/connection.sip | 32 +-
src/sip/constants.sip | 34 +-
src/sip/dbdatum.sip | 123 ----
src/sip/deviceproxy.sip | 232 ------
src/{boost/python => sip}/release.py | 38 +-
src/sip/setup.cfg | 2 +
src/sip/setup.py | 297 ++++++++
src/sip/{stdutils.sip => std_utils.sip} | 50 +-
src/sip/tango.sip | 31 -
src/swig/Makefile | 106 +++
src/swig/deviceproxy.i | 224 ++++++
src/swig/tango.i | 21 +
win/PyTango_VS10/PyTango.props | 11 +-
win/PyTango_VS10/PyTango.sln | 12 +-
win/PyTango_VS9/PyTango.sln | 60 +-
win/PyTango_VS9/PyTango.vcproj | 1 +
win/PyTango_VS9/PyTango.vsprops | 11 +-
winsetup.py | 57 +-
201 files changed, 8155 insertions(+), 6297 deletions(-)
diff --git a/IPython/Extensions/ipy_profile_tango.py b/IPython/Extensions/ipy_profile_tango.py
index eb4b79d..d54ef2c 100644
--- a/IPython/Extensions/ipy_profile_tango.py
+++ b/IPython/Extensions/ipy_profile_tango.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
""" IPython 'spock' profile, to preload PyTango and offer a friendly interface to Tango."""
@@ -35,4 +23,4 @@ def main():
except ImportError:
print "Unable to start spock profile, is PyTango installed?"
-main()
\ No newline at end of file
+main()
diff --git a/IPython/config/profile/tango/ipython_config.py b/IPython/config/profile/tango/ipython_config.py
index 225abba..e7f1ad0 100644
--- a/IPython/config/profile/tango/ipython_config.py
+++ b/IPython/config/profile/tango/ipython_config.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
config = get_config()
diff --git a/PKG-INFO b/PKG-INFO
index 81f737e..377dd76 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: PyTango
-Version: 8.0.3
+Version: 8.1.1
Summary: A python binding for the Tango control system
Home-page: http://www.tango-controls.org/static/PyTango/
Author: Tiago Coutinho
@@ -10,7 +10,7 @@ Download-URL: http://pypi.python.org/packages/source/P/PyTango
Description: This module implements the Python Tango Device API mapping.
Keywords: Tango,CORBA,binding
Platform: Linux
-Platform: Windows XP/Vista/7
+Platform: Windows XP/Vista/7/8
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Other Environment
Classifier: Intended Audience :: Developers
diff --git a/doc/WINDOWS-COMPILATION-EXAMPLE.TXT b/doc/WINDOWS-COMPILATION-EXAMPLE.TXT
deleted file mode 100644
index 877ac65..0000000
--- a/doc/WINDOWS-COMPILATION-EXAMPLE.TXT
+++ /dev/null
@@ -1,38 +0,0 @@
-
-REM Set environment variables needed to compile
-
-set TANGO_ROOT=C:\Program Files\tango\win32_vc8\win32_dll
-set BOOST_ROOT=C:\Program Files\boost\boost_1_38
-set OMNI_ROOT=%TANGO_ROOT%
-set NUMPY_ROOT=C:\sicilia\Python25\Lib\site-packages\numpy\core\
-
-dir "%OMNI_ROOT%"\lib
-dir "%BOOST_ROOT%\lib"
-
-
-
-REM For some reason distutils is trying to locate Vs9 tools...
-REM And obviously it fails. We will fool him with this:
-
-set VS90COMNTOOLS=%VS80COMNTOOLS%
-
-REM compile :)
-setup.py -v build
-
-
-
-
-
-
-
-REM ------------------------------------
-
-REM to compile:
-setup.py -v build
-
-REM to create a MSI windows installer:
-setup.py bdist_msi
-
-REM to create a EXE windows installer:
-setup.py bdist_wininst
-
diff --git a/doc/_static/banner.png b/doc/_static/banner.png
deleted file mode 100644
index 67ec30d..0000000
Binary files a/doc/_static/banner.png and /dev/null differ
diff --git a/doc/_static/banner1.png b/doc/_static/banner1.png
new file mode 100644
index 0000000..75ae5d5
Binary files /dev/null and b/doc/_static/banner1.png differ
diff --git a/doc/_static/banner2.png b/doc/_static/banner2.png
new file mode 100644
index 0000000..4eaf882
Binary files /dev/null and b/doc/_static/banner2.png differ
diff --git a/doc/_static/banner3.png b/doc/_static/banner3.png
new file mode 100644
index 0000000..6299619
Binary files /dev/null and b/doc/_static/banner3.png differ
diff --git a/doc/_static/boost_python_install.py b/doc/_static/boost_python_install.py
index 893dd43..381b219 100644
--- a/doc/_static/boost_python_install.py
+++ b/doc/_static/boost_python_install.py
@@ -1,7 +1,15 @@
-from __future__ import print_function
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
-"""
-*build boost python script on windows*
+"""*build boost python script on windows*
Purpose
Build boost-python on multiple architectures (32 and 64bits), with different toolsets (vc9, vc10),
@@ -15,21 +23,25 @@ How to use it
This script should be used together with another boost configuration file called user-config.jam.
- Download boost source code from http://wwww.boost.org
- - Extract boost to a directory (ex: c:\workspace\boost-1.53.0)
- - Place this file in your boost extract directory (ex: c:\workspace\boost-1.53.0\boost_python_install.py)
- - Place the user-config.jam file in %HOMEPATH%%HOMEDIR%
+ - Extract boost to a directory (ex: :file:`c:\\workspace\\boost-1.53.0`)
+ - Place this file in your boost extract directory
+ (ex: :file:`c:\\workspace\\boost-1.53.0\\boost_python_install.py`)
+ - Place the user-config.jam file in :envvar:`%HOMEPATH%%HOMEDIR%`
- Open a console
- Switch to the boost directory
- - Execute this script using python (ex: C:\Python\win32\26\python.exe boost_python_install.py
+ - Execute this script using python
+ (ex: :file:`C:\\Python\\win32\\26\\python.exe boost_python_install.py`
"""
+
+from __future__ import print_function
+
+
# b2 --with-python --prefix=c:\boost-1.53.0
# --libdir=c:\boost-1.53.0\msvc-9.0\Win32\release\shared\threading-multi\26
# toolset=msvc-9.0 address-model=32 variant=release link=shared
# threading=multi python=2.6 install
import os
-import sys
-import pprint
import subprocess
boost_version = r"1.53.0"
@@ -75,13 +87,10 @@ def _main():
toolsets = r"msvc-10.0",
pythons = "3.3",
- compile()
+ compile_boost()
-def compile():
- cur_dir = os.path.abspath(os.path.curdir)
-
+def compile_boost():
prefix = r"c:\boost-" + boost_version
- build_prefix = os.path.join(prefix, "build")
silent_args = ""
if silent:
@@ -98,8 +107,8 @@ def compile():
cmd_line_template = base_cmd_line
for option in options:
cmd_line_template += " --{0}={{{1}}}".format(option, option)
- for property in properties:
- cmd_line_template += " {0}={{{1}}}".format(property, property)
+ for prop in properties:
+ cmd_line_template += " {0}={{{1}}}".format(prop, prop)
cmd_line_template += " {0}".format(stage)
fh = open("NUL", "w")
@@ -152,4 +161,4 @@ def compile():
fh.close()
if __name__ == "__main__":
- main()
\ No newline at end of file
+ main()
diff --git a/doc/_static/green_python.png b/doc/_static/green_python.png
new file mode 100644
index 0000000..85903b8
Binary files /dev/null and b/doc/_static/green_python.png differ
diff --git a/doc/_static/green_python_original.png b/doc/_static/green_python_original.png
new file mode 100644
index 0000000..b09236d
Binary files /dev/null and b/doc/_static/green_python_original.png differ
diff --git a/doc/_static/slideshow.js b/doc/_static/slideshow.js
new file mode 100644
index 0000000..1b920c3
--- /dev/null
+++ b/doc/_static/slideshow.js
@@ -0,0 +1,33 @@
+$(document).ready(function()
+{
+ // Constants to be redefined
+ var FADE_TIME = 250;
+ var IMAGE_TIME = 5000;
+
+ var curr_index = 0;
+ var elements = $("#gallery").children();
+ elements.hide()
+ if (elements.length > 0)
+ {
+ elements.eq(0).show();
+ }
+ var slideshow_timer = setInterval(switch_image, IMAGE_TIME);
+
+ function switch_image()
+ {
+ old_index = curr_index;
+ if (curr_index < (elements.length-1)) {
+ curr_index += 1;
+ }
+ else {
+ curr_index = 0;
+ }
+ show_hide(curr_index, old_index);
+ }
+
+ function show_hide(show_index, hide_index)
+ {
+ elements.eq(hide_index).fadeOut(FADE_TIME);
+ elements.eq(show_index).delay(FADE_TIME+100).fadeIn(FADE_TIME);
+ }
+});
diff --git a/doc/_templates/index.html b/doc/_templates/index.html
index b2eec92..8d53c05 100644
--- a/doc/_templates/index.html
+++ b/doc/_templates/index.html
@@ -1,40 +1,182 @@
{% extends "layout.html" %}
{% set title = 'PyTango documentation' %}
+
+{% set script_files = script_files + ["_static/slideshow.js"] %}
+
{% block body %}
<h1>Welcome to PyTango documentation!</h1>
<p>
- PyTango is a python module that exposes to <a class="reference external" href="http://www.python.org/">Python</a>
- the complete <a class="reference external" href="http://www.tango-controls.org/">Tango</a> C++ API
- (including both client and server).
-
+ PyTango is a python module that exposes to <a class="reference external" href="http://www.python.org/">Python</a>
+ the complete <a class="reference external" href="http://www.tango-controls.org/">Tango</a> C++ API.
+ This means that you can write not only tango applications (scripts, CLIs, GUIs)
+ that access tango device servers but also tango device servers themselves, all
+ of this in pure python.
</p>
-<p>
- This means that you can write not only tango applications (scripts, CLIs, GUIs)
- that access tango device servers but also tango device servers themselves, all
- of this in pure python.
-</p>
+<div id="gallery" style="width:780px; height:525px; margin:auto;">
+
+ <!-- 1st snap -->
+ <img src="_static/banner1.png" />
+ <!-- 2nd snap -->
+ <img src="_static/banner2.png" />
+ <!-- 3rd snap -->
+ <img src="_static/banner3.png" />
+
+ <!-- 4th snap -->
+ <table style="width:100%;"><tr>
+ <td>
+
+<div class="highlight-python"><div class="highlight"><pre>
+<span class="c"># ----------------- server ------------------</span>
+
+<span class="kn">import</span> <span class="nn">time</span>
+
+<span class="kn">from</span> <span class="nn">PyTango.server</span> <span class="kn">import</span> <span class="n">server_run</span>
+<span class="kn">from</span> <span class="nn">PyTango.server</span> <span class="kn">import</span> <span class="n">Device</span><span class="p">,</span> <span class="n">DeviceMeta</span>
+<span class="kn">from</span> <span class="nn">PyTango.server</span> <span class="kn">import</span> <span class="n">attribute</span><span class="p">,</span> <span class="n">command</span>
+
+
+<span class="k">class</span> <span class="nc">Clock</span><span class="p">(</span><span class="n">Device</span><span class="p">):</span>
+ <span class="n">__metaclass__</span> <span class="o">=</span> <span class="n">DeviceMeta</span>
+
+ <span class="n">time</span> <span class="o">=</span> <span class="n">attribute</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">read_time</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
+
+ <span class="nd">@command</span><span class="p">(</span><span class="n">dtype_in</span><span class="o">=</span><span class="nb">str</span><span class="p">,</span> <span class="n">dtype_out</span><span class="o">=</span><span class="nb">str</span><span class="p">)</span>
+ <span class="k">def</span> <span class="nf">strftime</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tformat</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">time</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">tformat</span><span class="p">)</span>
+
+<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span>
+ <span class="n">server_run</span><span class="p">((</span><span class="n">Clock</span><span class="p">,))</span>
+</pre></div>
+</div>
+
+ </td>
+ <td>
+
+<div class="highlight-python"><div class="highlight"><pre>
+<span class="c">$ # ---------------- client -----------------</span>
+
+<span class="n">$ python</span>
+
+<span class="gp">>>> </span><span class="kn">from</span> <span class="nn">PyTango</span> <span class="kn">import</span> <span class="n">DeviceProxy</span>
+
+<span class="gp">>>> </span><span class="n">clock</span> <span class="o">=</span> <span class="n">DeviceProxy</span><span class="p">(</span><span class="s">"my/first/clock"</span><span class="p">)</span>
+
+<span class="gp">>>> </span><span class="n">clock</span><span class="o">.</span><span class="n">time</span>
+<span class="go">1384447223.774121</span>
+
+<span class="gp">>>> </span><span class="n">clock</span><span class="o">.</span><span class="n">read_attribute</span><span class="p">(</span><span class="s">"time"</span><span class="p">)</span><span class="o">.</span><span class="n">value</span>
+<span class="go">1384447252.037578</span>
+
+<span class="gp">>>> </span><span class="n">clock</span><span class="o">.</span><span class="n">command_inout</span><span class="p">(</span><span class="s">"strftime"</span><span class="p">,</span>
+<span class="gp">... </span> <span class="s">"%H:%M:%S"</span><span class="p">)</span>
+<span class="go">'17:41:50'</span>
+
+<span class="gp">>>> </span><span class="n">clock</span><span class="o">.</span><span class="n">status</span><span class="p">()</span>
+<span class="go">The device is in UNKNOWN state.</span>
+
+
+
+</pre></div>
+</div>
+
+ </td>
+ </tr></table>
+
+ <!-- 5th snap -->
+ <table style="width:100%;"><tr>
+ <td>
+
+<div class="highlight-python"><div class="highlight"><pre>
+<span class="gp">>>> </span><span class="c"># ---------- gevent client -----------</span>
+<span class="gp">>>> </span><span class="kn">from</span> <span class="nn">PyTango.gevent</span> <span class="kn">import</span> <span class="n">DeviceProxy</span>
+
+<span class="gp">>>> </span><span class="n">dev</span> <span class="o">=</span> <span class="n">DeviceProxy</span><span class="p">(</span><span class="s">"sys/tg_test/1"</span><span class="p">)</span>
+<span class="gp">>>> </span><span class="n">dev</span><span class="o">.</span><span class="n">get_green_mode</span><span class="p">()</span>
+<span class="go">PyTango.GreenMode.Gevent</span>
+
+<span class="gp">>>> </span><span class="c"># Synchronous but green!</span>
+<span class="gp">>>> </span><span class="k">print</span><span class="p">(</span><span class="n">dev</span><span class="o">.</span><span class="n">state</span><span class="p">())</span>
+<span class="go">RUNNING</span>
+
+<span class="gp">>>> </span><span class="c"># Asynchronous</span>
+<span class="gp">>>> </span><span class="n">res</span> <span class="o">=</span> <span class="n">dev</span><span class="o">.</span><span class="n">state</span><span class="p">(</span><span class="n">wait</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
+<span class="gp">>>> </span><span class="k">print</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
+<span class="go"><gevent.event.AsyncResult at 0x1a74050></span>
+<span class="gp">>>> </span><span class="k">print</span><span class="p">(</span><span class="n">res</span><span class="o">.</span><span class="n">get</span><span class="p">())</span>
+<span class="go">RUNNING</span>
+
+<span class="gp">>>> </span><span class="c"># Synchronous, but green!</span>
+<span class="gp">>>> </span><span class="k">print</span><span class="p">(</span><span class="n">dev</span><span class="o">.</span><span class="n">long_scalar</span><span class="p">)</span>
+<span class="go">832</span>
+
+<span class="gp">>>> </span><span class="c"># Asynchronous</span>
+<span class="gp">>>> </span><span class="n">res</span> <span class="o">=</span> <span class="n">dev</span><span class="o">.</span><span class="n">read_attribute</span><span class="p">(</span><span class="s">"long_scalar"</span><span class="p">,</span>
+<span class="gp">... </span> <span class="n">wait</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
+<span class="gp">>>> </span><span class="k">print</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
+<span class="go"><gevent.event.AsyncResult at 0x1a9f54></span>
+<span class="gp">>>> </span><span class="k">print</span><span class="p">(</span><span class="n">res</span><span class="o">.</span><span class="n">get</span><span class="p">())</span>
+<span class="go">126</span>
+</pre></div>
+</div>
+
+ </td>
+ <td>
+
+<div class="highlight-python"><div class="highlight"><pre>
+<span class="gp">>>> </span><span class="c"># ----- concurrent.futures client -----</span>
+<span class="gp">>>> </span><span class="kn">from</span> <span class="nn">PyTango.futures</span> <span class="kn">import</span> <span class="n">DeviceProxy</span>
+
+<span class="gp">>>> </span><span class="n">dev</span> <span class="o">=</span> <span class="n">DeviceProxy</span><span class="p">(</span><span class="s">"sys/tg_test/1"</span><span class="p">)</span>
+<span class="gp">>>> </span><span class="n">dev</span><span class="o">.</span><span class="n">get_green_mode</span><span class="p">()</span>
+<span class="go">PyTango.GreenMode.Futures</span>
+
+<span class="gp">>>> </span><span class="c"># Synchronous</span>
+<span class="gp">>>> </span><span class="k">print</span><span class="p">(</span><span class="n">dev</span><span class="o">.</span><span class="n">state</span><span class="p">())</span>
+<span class="go">RUNNING</span>
+
+<span class="gp">>>> </span><span class="c"># Asynchronous</span>
+<span class="gp">>>> </span><span class="n">res</span> <span class="o">=</span> <span class="n">dev</span><span class="o">.</span><span class="n">state</span><span class="p">(</span><span class="n">wait</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
+<span class="gp">>>> </span><span class="k">print</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
+<span class="go"><Future at 0x34a9e51 state=pending></span>
+<span class="gp">>>> </span><span class="k">print</span><span class="p">(</span><span class="n">res</span><span class="o">.</span><span class="n">result</span><span class="p">())</span>
+<span class="go">RUNNING</span>
+
+<span class="gp">>>> </span><span class="c"># Synchronous</span>
+<span class="gp">>>> </span><span class="k">print</span><span class="p">(</span><span class="n">dev</span><span class="o">.</span><span class="n">long_scalar</span><span class="p">)</span>
+<span class="go">832</span>
+
+<span class="gp">>>> </span><span class="c"># Asynchronous</span>
+<span class="gp">>>> </span><span class="n">res</span> <span class="o">=</span> <span class="n">dev</span><span class="o">.</span><span class="n">read_attribute</span><span class="p">(</span><span class="s">"long_scalar"</span><span class="p">,</span>
+<span class="gp">... </span> <span class="n">wait</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
+<span class="gp">>>> </span><span class="k">print</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
+<span class="go"><Future at 0x5d8a17b state=pending></span>
+<span class="gp">>>> </span><span class="k">print</span><span class="p">(</span><span class="n">res</span><span class="o">.</span><span class="n">result</span><span class="p">())</span>
+<span class="go">126</span>
+</pre></div>
+</div>
+
+ </td>
+ </tr></table>
-<div class="figure align-center">
-<img alt="ITango" src="_static/banner.png" style="width: 70%;" />
</div>
<p>
Check out the <a class="reference internal" href="start.html#getting-started"><em>getting started guide</em></a>
to learn how to build and/or install PyTango and after that the <a class="reference internal" href="quicktour.html#quick-tour"><em>quick tour</em></a>
can help you with the first steps in the PyTango world.
-</p>
-
-<p>
If you need help understanding what Tango itself really is, you can check the
<a class="reference external" href="http://www.tango-controls.org/">Tango</a>
homepage where you will find plenty of documentation, FAQ and tutorials.
</p>
<p>
- A PDF version can be downloaded from <a href="PyTango.pdf">here</a>.
+ A PDF version of this documentation can be downloaded from <a href="PyTango.pdf">here</a>.
</p>
<p>
For convenience here are the links to other versions:<br/>
@@ -42,6 +184,8 @@
<a href="http://www.tango-controls.org/static/PyTango/latest/doc/html">Latest stable</a>
+ <a href="http://www.tango-controls.org/static/PyTango/v803/doc/html">8.0.3</a>
+
<a href="http://www.tango-controls.org/static/PyTango/v723/doc/html">7.2.3</a>
</p>
diff --git a/doc/_templates/indexsidebar.html b/doc/_templates/indexsidebar.html
index 5a9747d..f91d749 100644
--- a/doc/_templates/indexsidebar.html
+++ b/doc/_templates/indexsidebar.html
@@ -1,7 +1,9 @@
<h3>Download</h3>
<p>Current version: <b>{{ version }}</b></p>
-<p>Get PyTango from the <a href="http://pypi.python.org/pypi/PyTango">PyPi</a>,
+<p>Get PyTango from <a href="http://pypi.python.org/pypi/PyTango">PyPi</a><br/>
or install it with:</p>
+<pre>pip install PyTango</pre>
+or
<pre>easy_install -U PyTango</pre>
<h3>PDF</h3>
diff --git a/doc/_templates/layout.html b/doc/_templates/layout.html
index cb4dc53..0e1e248 100644
--- a/doc/_templates/layout.html
+++ b/doc/_templates/layout.html
@@ -1,19 +1,6 @@
{% extends "sphinxdoc/layout.html" %}
{% block extrahead %}
- <script src="{{ pathto('_static/js/jquery.min.js',1) }}"></script>
- <script src="{{ pathto('_static/js/jquery.mousewheel.min.js',1) }}"></script>
- <script src="{{ pathto('_static/js/jquery.terminal.min.js',1) }}"></script>
- <link href="{{ pathto('_static/css/jquery.terminal.css',1) }}" rel="stylesheet"/>
-
- <link href="{{ pathto('_static/css/start/jquery-ui-1.8.10.custom.css',1) }}" rel="stylesheet"/>
- <link href="{{ pathto('_static/css/pytango.css',1) }}" rel="stylesheet"/>
- <link href="{{ pathto('_static/css/pytango_terminal.css',1) }}" rel="stylesheet"/>
- <script src="{{ pathto('_static/js/jquery-ui-1.8.10.custom.min.js',1) }}"></script>
-
- <script src="{{ pathto('_static/js/dterm.js',1) }}"></script>
- <script src="{{ pathto('_static/js/pytango.js',1) }}"></script>
-
{% endblock %}
{% block rootrellink %}
diff --git a/doc/api.rst b/doc/api.rst
index dec2d01..745ab10 100644
--- a/doc/api.rst
+++ b/doc/api.rst
@@ -7,9 +7,12 @@
PyTango API
===========
+.. automodule:: PyTango
+
.. toctree::
:maxdepth: 2
+ data_types
client/index
database
server/index
diff --git a/doc/client/index.rst b/doc/client/index.rst
index b2af241..317614a 100644
--- a/doc/client/index.rst
+++ b/doc/client/index.rst
@@ -1,5 +1,5 @@
-The Tango Device Python API
-===========================
+Client API
+==========
.. toctree::
:maxdepth: 2
diff --git a/doc/client/miscellaneous.rst b/doc/client/miscellaneous.rst
index 55cd8c2..66c183e 100644
--- a/doc/client/miscellaneous.rst
+++ b/doc/client/miscellaneous.rst
@@ -1,6 +1,292 @@
+.. currentmodule:: PyTango
+Green objects
+-------------
-.. currentmodule:: PyTango
+PyTango supports cooperative green Tango objects. Since version 8.1 two *green*
+modes have been added: :obj:`~PyTango.GreenMode.Gevent` and
+:obj:`~PyTango.GreenMode.Futures`.
+
+The :obj:`~PyTango.GreenMode.Gevent` mode uses the well known :mod:`gevent`
+module. The :obj:`~PyTango.GreenMode.Futures` uses the standard python module
+:mod:`concurrent.futures`.
+
+You can set the PyTango green mode at a global level. Set the environment
+variable :envvar:`PYTANGO_GREEN_MODE` to either gevent_ or futures
+(case incensitive). If this environment variable is not defined the PyTango
+global green mode defaults to *Synchronous*.
+
+Currently, at version 8.1, only :class:`DeviceProxy` has been modified to work
+in a green cooperative way. If the work is found to be useful, the same can
+be implemented in the future for :class:`AttributeProxy` and even
+to :class:`Database`.
+
+
+
+You can also change the active global green mode at any time in your program::
+
+ >>> from PyTango import DeviceProxy, GreenMode
+ >>> from PyTango import set_green_mode, get_green_mode
+
+ >>> get_green_mode()
+ PyTango.GreenMode.Synchronous
+
+ >>> dev = DeviceProxy("sys/tg_test/1")
+ >>> dev.get_green_mode()
+ PyTango.GreenMode.Synchronous
+
+ >>> set_green_mode(GreenMode.Gevent)
+ >>> get_green_mode()
+ PyTango.GreenMode.Gevent
+
+ >>> dev.get_green_mode()
+ PyTango.GreenMode.Gevent
+
+As you can see by the example, the global green mode will affect any previously
+created :class:`DeviceProxy` using the default constructor parameters.
+
+You can specificy green mode on a :class:`DeviceProxy` at creation time.
+You can also change the green mode at any time::
+
+ >>> from PyTango.gevent import DeviceProxy
+
+ >>> dev = DeviceProxy("sys/tg_test/1")
+ >>> dev.get_green_mode()
+ PyTango.GreenMode.Gevent
+
+ >>> from PyTango import GreenMode
+ >>> from PyTango import set_green_mode, get_green_mode
+ >>> get_green_mode()
+ PyTango.GreenMode.Synchronous
+
+ >>> dev.set_green_mode(GreenMode.Synchronous)
+ >>> dev.get_green_mode()
+ PyTango.GreenMode.Synchronous
+
+gevent mode
+~~~~~~~~~~~
+
+Using :mod:`gevent` cooperative mode in PyTango is relatively easy::
+
+ >>> from PyTango.gevent import DeviceProxy
+
+ >>> dev = DeviceProxy("sys/tg_test/1")
+ >>> dev.get_green_mode()
+ PyTango.GreenMode.Gevent
+
+ >>> print(dev.state())
+ RUNNING
+
+The :func:`PyTango.gevent.DeviceProxy` API is exactly the same as the standard
+:class:`~PyTango.DeviceProxy`. The difference is in the semantics of the methods
+that involve synchronous network calls (constructor included) which may block
+the execution for a relatively big amount of time.
+The list of methods that have been modified to accept *gevent* semantics are,
+on the :func:`PyTango.gevent.DeviceProxy`:
+
+* Constructor
+* :meth:`~DeviceProxy.state`
+* :meth:`~DeviceProxy.status`
+* :meth:`~DeviceProxy.read_attribute`
+* :meth:`~DeviceProxy.write_attribute`
+* :meth:`~DeviceProxy.write_read_attribute`
+* :meth:`~DeviceProxy.read_attributes`
+* :meth:`~DeviceProxy.write_attributes`
+* :meth:`~DeviceProxy.ping`
+
+So how does this work in fact? I see no difference from using the *standard*
+:class:`~PyTango.DeviceProxy`.
+Well, this is, in fact, one of the goals: be able to use a gevent cooperation
+without changing the API. Behind the scenes the methods mentioned before have
+been modified to be able to work cooperatively with other greenlets.
+
+All of the above methods have been boosted with two extra keyword arguments
+*wait* and *timeout* which allow to fine tune the behaviour.
+The *wait* parameter is by default set to `True` meaning wait for the request
+to finish (the default semantics when not using green mode).
+If *wait* is set to `True`, the timeout determines the maximum time to wait for
+the method to execute. The default timeout is `None` which means wait forever.
+If *wait* is set to `False`, the *timeout* is ignored.
+
+If *wait* is set to `True`, the result is the same as executing the
+*standard* method on a :class:`~PyTango.DeviceProxy`.
+If, *wait* is set to `False`, the result will be a
+:class:`gevent.event.AsyncResult`. In this case, to get the actual value
+you will need to do something like::
+
+ >>> from PyTango.gevent import DeviceProxy
+
+ >>> dev = DeviceProxy("sys/tg_test/1")
+ >>> result = dev.state(wait=False)
+ >>> result
+ <gevent.event.AsyncResult at 0x1a74050>
+
+ >>> # this will be the blocking code
+ >>> state = result.get()
+ >>> print(state)
+ RUNNING
+
+Here is another example using :meth:`~DeviceProxy.read_attribute`::
+
+ >>> from PyTango.gevent import DeviceProxy
+
+ >>> dev = DeviceProxy("sys/tg_test/1")
+ >>> result = dev.read_attribute('wave', wait=False)
+ >>> result
+ <gevent.event.AsyncResult at 0x1aff54e>
+
+ >>> dev_attr = result.get()
+ >>> print(dev_attr)
+ DeviceAttribute[
+ data_format = PyTango.AttrDataFormat.SPECTRUM
+ dim_x = 256
+ dim_y = 0
+ has_failed = False
+ is_empty = False
+ name = 'wave'
+ nb_read = 256
+ nb_written = 0
+ quality = PyTango.AttrQuality.ATTR_VALID
+ r_dimension = AttributeDimension(dim_x = 256, dim_y = 0)
+ time = TimeVal(tv_nsec = 0, tv_sec = 1383923292, tv_usec = 886720)
+ type = PyTango.CmdArgType.DevDouble
+ value = array([ -9.61260664e-01, -9.65924853e-01, -9.70294813e-01,
+ -9.74369212e-01, -9.78146810e-01, -9.81626455e-01,
+ -9.84807087e-01, -9.87687739e-01, -9.90267531e-01,
+ ...
+ 5.15044507e-1])
+ w_dim_x = 0
+ w_dim_y = 0
+ w_dimension = AttributeDimension(dim_x = 0, dim_y = 0)
+ w_value = None]
+
+.. note::
+ due to the internal workings of gevent, setting the *wait* flag to
+ `True` (default) doesn't prevent other greenlets from running in *parallel*.
+ This is, in fact, one of the major bonus of working with :mod:`gevent` when
+ compared with :mod:`concurrent.futures`
+
+futures mode
+~~~~~~~~~~~~
+
+Using :mod:`concurrent.futures` cooperative mode in PyTango is relatively easy::
+
+ >>> from PyTango.futures import DeviceProxy
+
+ >>> dev = DeviceProxy("sys/tg_test/1")
+ >>> dev.get_green_mode()
+ PyTango.GreenMode.Futures
+
+ >>> print(dev.state())
+ RUNNING
+
+The :func:`PyTango.futures.DeviceProxy` API is exactly the same as the standard
+:class:`~PyTango.DeviceProxy`. The difference is in the semantics of the methods
+that involve synchronous network calls (constructor included) which may block
+the execution for a relatively big amount of time.
+The list of methods that have been modified to accept *futures* semantics are,
+on the :func:`PyTango.futures.DeviceProxy`:
+
+* Constructor
+* :meth:`~DeviceProxy.state`
+* :meth:`~DeviceProxy.status`
+* :meth:`~DeviceProxy.read_attribute`
+* :meth:`~DeviceProxy.write_attribute`
+* :meth:`~DeviceProxy.write_read_attribute`
+* :meth:`~DeviceProxy.read_attributes`
+* :meth:`~DeviceProxy.write_attributes`
+* :meth:`~DeviceProxy.ping`
+
+So how does this work in fact? I see no difference from using the *standard*
+:class:`~PyTango.DeviceProxy`.
+Well, this is, in fact, one of the goals: be able to use a *futures* cooperation
+without changing the API. Behind the scenes the methods mentioned before have
+been modified to be able to work cooperatively.
+
+All of the above methods have been boosted with two extra keyword arguments
+*wait* and *timeout* which allow to fine tune the behaviour.
+The *wait* parameter is by default set to `True` meaning wait for the request
+to finish (the default semantics when not using green mode).
+If *wait* is set to `True`, the timeout determines the maximum time to wait for
+the method to execute. The default is `None` which means wait forever. If *wait*
+is set to `False`, the *timeout* is ignored.
+
+If *wait* is set to `True`, the result is the same as executing the
+*standard* method on a :class:`~PyTango.DeviceProxy`.
+If, *wait* is set to `False`, the result will be a
+:class:`concurrent.futures.Future`. In this case, to get the actual value
+you will need to do something like::
+
+ >>> from PyTango.futures import DeviceProxy
+
+ >>> dev = DeviceProxy("sys/tg_test/1")
+ >>> result = dev.state(wait=False)
+ >>> result
+ <Future at 0x16cb310 state=pending>
+
+ >>> # this will be the blocking code
+ >>> state = result.result()
+ >>> print(state)
+ RUNNING
+
+Here is another example using :meth:`~DeviceProxy.read_attribute`::
+
+ >>> from PyTango.futures import DeviceProxy
+
+ >>> dev = DeviceProxy("sys/tg_test/1")
+ >>> result = dev.read_attribute('wave', wait=False)
+ >>> result
+ <Future at 0x16cbe50 state=pending>
+
+ >>> dev_attr = result.result()
+ >>> print(dev_attr)
+ DeviceAttribute[
+ data_format = PyTango.AttrDataFormat.SPECTRUM
+ dim_x = 256
+ dim_y = 0
+ has_failed = False
+ is_empty = False
+ name = 'wave'
+ nb_read = 256
+ nb_written = 0
+ quality = PyTango.AttrQuality.ATTR_VALID
+ r_dimension = AttributeDimension(dim_x = 256, dim_y = 0)
+ time = TimeVal(tv_nsec = 0, tv_sec = 1383923329, tv_usec = 451821)
+ type = PyTango.CmdArgType.DevDouble
+ value = array([ -9.61260664e-01, -9.65924853e-01, -9.70294813e-01,
+ -9.74369212e-01, -9.78146810e-01, -9.81626455e-01,
+ -9.84807087e-01, -9.87687739e-01, -9.90267531e-01,
+ ...
+ 5.15044507e-1])
+ w_dim_x = 0
+ w_dim_y = 0
+ w_dimension = AttributeDimension(dim_x = 0, dim_y = 0)
+ w_value = None]
+
+Green API
+~~~~~~~~~
+
+Summary:
+ * :func:`PyTango.get_green_mode`
+ * :func:`PyTango.set_green_mode`
+ * :func:`PyTango.gevent.DeviceProxy`
+ * :func:`PyTango.futures.DeviceProxy`
+
+.. autofunction:: PyTango.get_green_mode
+
+.. autofunction:: PyTango.set_green_mode
+
+.. autofunction:: PyTango.gevent.DeviceProxy
+
+.. autofunction:: PyTango.futures.DeviceProxy
+
+
+Low level API
+#############
+
+.. autofunction:: get_device_proxy
+
+.. autofunction:: get_attribute_proxy
API util
--------
@@ -15,6 +301,7 @@ See also `Event configuration information`_
Attribute
~~~~~~~~~
+
.. autoclass:: PyTango.AttributeAlarmInfo
:members:
@@ -142,3 +429,4 @@ See :class:`DeviceAttribute`.
:members:
See :class:`DeviceData`.
+
diff --git a/doc/client/other.rst b/doc/client/other.rst
index 910e026..d8b7fe8 100644
--- a/doc/client/other.rst
+++ b/doc/client/other.rst
@@ -50,6 +50,9 @@ Enumerations
.. autoclass:: PyTango.DispLevel
+.. autoclass:: PyTango.GreenMode
+
+
Other classes
~~~~~~~~~~~~~
@@ -57,4 +60,4 @@ Other classes
:members:
.. autoclass:: PyTango.TimeVal
- :members:
\ No newline at end of file
+ :members:
diff --git a/doc/conf.py b/doc/conf.py
index 0a0fa86..302e1b5 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -1,37 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
-
-#
-# PyTango documentation build configuration file, created by
-# sphinx-quickstart on Fri Jun 5 14:31:50 2009.
-#
-# This file is execfile()d with the current directory set to its containing dir.
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
import sys
import os
@@ -43,6 +19,8 @@ import PyTango
# documentation root, use os.path.abspath to make it absolute, like shown here.
sys.path.append(os.path.abspath('sphinxext'))
+needs_sphinx = "1.0"
+
# -- General configuration -----------------------------------------------------
# Add any Sphinx extension module names here, as strings. They can be extensions
@@ -73,12 +51,19 @@ master_doc = 'contents'
# General information about the project.
project = u'PyTango'
-copyright = u'2012, ALBA - CELLS'
copyright = u"""Except where otherwise noted, content on this site is
licensed under a Creative Commons Attribution 3.0 License"""
#Ideally we would like to put the following html code for copyright... but how?
-'''<a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/es/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/es/88x31.png" /></a><br /><span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type">Tau Documentation</span> by <span xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">CELLS - ALBA</span> is licensed under a <a rel="licens [...]
+'''\
+<a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/es/">
+ <img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/es/88x31.png" />
+</a><br />
+<span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type">PyTango Documentation</span>
+by
+<span xmlns:cc="http://creativecommons.org/ns#" property="cc:attributionName">ESRF</span>
+is licensed under a
+<a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/es/">Creative Commons Attribution-Share Alike 3.0 Spain License</a>.'''
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
@@ -210,12 +195,6 @@ htmlhelp_basename = 'PyTangodoc'
# -- Options for LaTeX output --------------------------------------------------
-# The paper size ('letter' or 'a4').
-latex_paper_size = 'a4'
-
-# The font size ('10pt', '11pt' or '12pt').
-latex_font_size = '10pt'
-
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
@@ -229,8 +208,11 @@ latex_logo = '_static/logo.png'
latex_elements = {
'fontpkg': '\\usepackage{palatino}',
+ 'papersize': 'a4paper',
+ 'pointsize': '10pt',
+
}
-latex_show_urls = 'footnote'
+latex_show_urls = 'no'
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
@@ -245,6 +227,19 @@ latex_show_urls = 'footnote'
# If false, no module index is generated.
#latex_use_modindex = True
+# -- Options for RST -----------------------------------------------------------
+
+rst_epilog = """\
+.. _Tango: http://www.tango-controls.org/
+.. _Python: http://python.org/
+.. _IPython: http://ipython.org/
+.. _numpy: http://www.numpy.org/
+.. _gevent: http://www.gevent.org/
+.. _boost-python: http://www.boost.org/libs/python/
+.. _PyPi: https://pypi.python.org/pypi/PyTango/
+
+"""
+
# -- Options for reference to other documentation ------------------------------
intersphinx_mapping = {
diff --git a/doc/data_types.rst b/doc/data_types.rst
new file mode 100644
index 0000000..01d17cc
--- /dev/null
+++ b/doc/data_types.rst
@@ -0,0 +1,200 @@
+.. currentmodule:: PyTang
+
+.. _pytango-data-types:
+
+Data types
+==========
+
+This chapter describes the mapping of data types between Python and Tango.
+
+Tango has more data types than Python which is more dynamic. The input and
+output values of the commands are translated according to the array below.
+Note that if PyTango is compiled with :py:mod:`numpy` support the numpy type
+will be the used for the input arguments. Also, it is recomended to use numpy
+arrays of the appropiate type for output arguments as well, as they tend to be
+much more efficient.
+
+**For scalar types (SCALAR)**
+
++-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| Tango data type | Python 2.x type | Python 3.x type (*New in PyTango 8.0*) |
++=========================+===========================================================================+===========================================================================+
+| DEV_VOID | No data | No data |
++-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEV_BOOLEAN | :py:obj:`bool` | :py:obj:`bool` |
++-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEV_SHORT | :py:obj:`int` | :py:obj:`int` |
++-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEV_LONG | :py:obj:`int` | :py:obj:`int` |
++-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEV_LONG64 | - :py:obj:`long` (on a 32 bits computer) | :py:obj:`int` |
+| | - :py:obj:`int` (on a 64 bits computer) | |
++-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEV_FLOAT | :py:obj:`float` | :py:obj:`float` |
++-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEV_DOUBLE | :py:obj:`float` | :py:obj:`float` |
++-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEV_USHORT | :py:obj:`int` | :py:obj:`int` |
++-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEV_ULONG | :py:obj:`int` | :py:obj:`int` |
++-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEV_ULONG64 | * :py:obj:`long` (on a 32 bits computer) | :py:obj:`int` |
+| | * :py:obj:`int` (on a 64 bits computer) | |
++-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEV_STRING | :py:obj:`str` | :py:obj:`str` (decoded with *latin-1*, aka *ISO-8859-1*) |
++-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | sequence of two elements: | sequence of two elements: |
+| DEV_ENCODED | | |
+| (*New in PyTango 8.0*) | 0. :py:obj:`str` | 0. :py:obj:`str` (decoded with *latin-1*, aka *ISO-8859-1*) |
+| | 1. :py:obj:`bytes` (for any value of *extract_as*) | 1. :py:obj:`bytes` (for any value of *extract_as*, except String. |
+| | | In this case it is :py:obj:`str` (decoded with default python |
+| | | encoding *utf-8*)) |
++-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+
+**For array types (SPECTRUM/IMAGE)**
+
++-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| Tango data type | ExtractAs | Data type (Python 2.x) | Data type (Python 3.x) (*New in PyTango 8.0*) |
++=========================+=================+===========================================================================+===========================================================================+
+| DEVVAR_CHARARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint8`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint8`) |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | List | :py:class:`list` <:py:obj:`int`> | :py:class:`list` <:py:obj:`int`> |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | Tuple | :py:class:`tuple` <:py:obj:`int`> | :py:class:`tuple` <:py:obj:`int`> |
++-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEVVAR_SHORTARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint16`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint16`) |
+| or +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| (DEV_SHORT + SPECTRUM) | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
+| or +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| (DEV_SHORT + IMAGE) | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | List | :py:class:`list` <:py:obj:`int`> | :py:class:`list` <:py:obj:`int`> |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | Tuple | :py:class:`tuple` <:py:obj:`int`> | :py:class:`tuple` <:py:obj:`int`> |
++-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEVVAR_LONGARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint32`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint32`) |
+| or +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| (DEV_LONG + SPECTRUM) | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
+| or +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| (DEV_LONG + IMAGE) | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | List | :py:class:`list` <:py:obj:`int`> | :py:class:`list` <:py:obj:`int`> |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | Tuple | :py:class:`tuple` <:py:obj:`int`> | :py:class:`tuple` <:py:obj:`int`> |
++-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEVVAR_LONG64ARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint64`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint64`) |
+| or +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| (DEV_LONG64 + SPECTRUM) | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
+| or +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| (DEV_LONG64 + IMAGE) | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | List | :py:class:`list` <int (64 bits) / long (32 bits)> | :py:class:`list` <:py:obj:`int`> |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | Tuple | :py:class:`tuple` <int (64 bits) / long (32 bits)> | :py:class:`tuple` <:py:obj:`int`> |
++-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEVVAR_FLOATARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.float32`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.float32`) |
+| or +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| (DEV_FLOAT + SPECTRUM) | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
+| or +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| (DEV_FLOAT + IMAGE) | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | List | :py:class:`list` <:py:obj:`float`> | :py:class:`list` <:py:obj:`float`> |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | Tuple | :py:class:`tuple` <:py:obj:`float`> | :py:class:`tuple` <:py:obj:`float`> |
++-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEVVAR_DOUBLEARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.float64`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.float64`) |
+| or +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| (DEV_DOUBLE + SPECTRUM) | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
+| or +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| (DEV_DOUBLE + IMAGE) | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | List | :py:class:`list` <:py:obj:`float`> | :py:class:`list` <:py:obj:`float`> |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | Tuple | :py:class:`tuple` <:py:obj:`float`> | :py:class:`tuple` <:py:obj:`float`> |
++-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEVVAR_USHORTARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint16`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint16`) |
+| or +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| (DEV_USHORT + SPECTRUM) | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
+| or +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| (DEV_USHORT + IMAGE) | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | List | :py:class:`list` <:py:obj:`int`> | :py:class:`list` <:py:obj:`int`> |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | Tuple | :py:class:`tuple` <:py:obj:`int`> | :py:class:`tuple` <:py:obj:`int`> |
++-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEVVAR_ULONGARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint32`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint32`) |
+| or +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| (DEV_ULONG + SPECTRUM) | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
+| or +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| (DEV_ULONG + IMAGE) | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | List | :py:class:`list` <:py:obj:`int`> | :py:class:`list` <:py:obj:`int`> |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | Tuple | :py:class:`tuple` <:py:obj:`int`> | :py:class:`tuple` <:py:obj:`int`> |
++-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEVVAR_ULONG64ARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint64`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint64`) |
+| or +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| (DEV_ULONG64 + SPECTRUM)| Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
+| or +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| (DEV_ULONG64 + IMAGE) | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | List | :py:class:`list` <int (64 bits) / long (32 bits)> | :py:class:`list` <:py:obj:`int`> |
+| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | Tuple | :py:class:`tuple` <int (64 bits) / long (32 bits)> | :py:class:`tuple` <:py:obj:`int`> |
++-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| DEVVAR_STRINGARRAY | | sequence<:py:obj:`str`> | sequence<:py:obj:`str`> |
+| or | | | (decoded with *latin-1*, aka *ISO-8859-1*) |
+| (DEV_STRING + SPECTRUM) | | | |
+| or | | | |
+| (DEV_STRING + IMAGE) | | | |
++-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | | sequence of two elements: | sequence of two elements: |
+| DEV_LONGSTRINGARRAY | | | |
+| | | 0. :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.int32`) or | 0. :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.int32`) or |
+| | | sequence<:py:obj:`int`> | sequence<:py:obj:`int`> |
+| | | 1. sequence<:py:obj:`str`> | 1. sequence<:py:obj:`str`> (decoded with *latin-1*, aka *ISO-8859-1*) |
++-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+| | | sequence of two elements: | sequence of two elements: |
+| DEV_DOUBLESTRINGARRAY | | | |
+| | | 0. :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.float64`) or | 0. :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.float64`) or |
+| | | sequence<:py:obj:`int`> | sequence<:py:obj:`int`> |
+| | | 1. sequence<:py:obj:`str`> | 1. sequence<:py:obj:`str`> (decoded with *latin-1*, aka *ISO-8859-1*) |
++-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+
+For SPECTRUM and IMAGES the actual sequence object used depends on the context
+where the tango data is used, and the availability of :py:mod:`numpy`.
+
+1. for properties the sequence is always a :py:class:`list`. Example::
+
+ >>> import PyTango
+ >>> db = PyTango.Database()
+ >>> s = db.get_property(["TangoSynchrotrons"])
+ >>> print type(s)
+ <type 'list'>
+
+2. for attribute/command values
+ - :py:class:`numpy.ndarray` if PyTango was compiled with :py:mod:`numpy`
+ support (default) and :py:mod:`numpy` is installed.
+ - :py:class:`list` otherwise
diff --git a/doc/database.rst b/doc/database.rst
index 0450b3c..3a3eefd 100644
--- a/doc/database.rst
+++ b/doc/database.rst
@@ -1,5 +1,5 @@
-The Tango Database Python API
-=============================
+Database API
+============
.. currentmodule:: PyTango
diff --git a/doc/encoded.rst b/doc/encoded.rst
index f85b137..8851023 100644
--- a/doc/encoded.rst
+++ b/doc/encoded.rst
@@ -1,12 +1,12 @@
.. _encoded:
-The Tango Encoded Python API
-============================
+Encoded API
+===========
*This feature is only possible since PyTango 7.1.4*
.. currentmodule:: PyTango
.. autoclass:: PyTango.EncodedAttribute
- :members:
\ No newline at end of file
+ :members:
diff --git a/doc/itango/features.rst b/doc/itango/features.rst
index 0033858..8a5b66f 100644
--- a/doc/itango/features.rst
+++ b/doc/itango/features.rst
@@ -38,5 +38,3 @@ Plus an additional set o Tango_ specific features:
Check the :ref:`itango-highlights` to see how to put these feature to good use
:-)
-.. _IPython: http://ipython.org/
-.. _Tango: http://www.tango-controls.org/
\ No newline at end of file
diff --git a/doc/itango/highlights.rst b/doc/itango/highlights.rst
index bfd12a1..02575e8 100644
--- a/doc/itango/highlights.rst
+++ b/doc/itango/highlights.rst
@@ -643,5 +643,4 @@ To stop monitoring the attribute:
.. note::
Type 'mon?' to see detailed information about this magic command
-.. _IPython: http://ipython.org/
-.. _Tango: http://www.tango-controls.org/
+
diff --git a/doc/itango/index.rst b/doc/itango/index.rst
index 3a6cd05..25f123b 100644
--- a/doc/itango/index.rst
+++ b/doc/itango/index.rst
@@ -30,8 +30,3 @@ and you should get something like this:
features
highlights
-
---------------------------------------------------------------------------------
-
-.. _IPython: http://ipython.org/
-.. _Tango: http://www.tango-controls.org/
diff --git a/doc/quicktour.rst b/doc/quicktour.rst
index a881b76..1ed0cbc 100644
--- a/doc/quicktour.rst
+++ b/doc/quicktour.rst
@@ -14,7 +14,7 @@ Quick tour on the client side
Check PyTango version
~~~~~~~~~~~~~~~~~~~~~
-Start an ipython tango console with::
+Start an IPython_ tango console with::
$ itango
@@ -177,9 +177,9 @@ structures.
.. note::
notice that the command returns a list of two elements. The first element is
- a :class:`numpy.ndarray` (assuming PyTango is compiled with numpy support).
+ a :class:`numpy.ndarray` (assuming PyTango is compiled with numpy_ support).
This is because PyTango does a best effort to convert all numeric array types
- to numpy arrays.
+ to numpy_ arrays.
Reading and writing attributes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -500,4 +500,3 @@ The following code is the complete device server code::
Quick tour (original) <quicktour_old>
-.. _IPython: http://ipython.scipy.org/
diff --git a/doc/revision.rst b/doc/revision.rst
index 939582e..b7b68f8 100644
--- a/doc/revision.rst
+++ b/doc/revision.rst
@@ -12,7 +12,7 @@ Revision
History of modifications:
+----------+----------------------------------------------------------------------------------+-----------------------------------------------------+-----------------------+
-| Date | Revision | Description | Author |
+| Date | Revision | Description | Author |
+==========+==================================================================================+=====================================================+=======================+
| 18/07/03 | 1.0 | Initial Version | M\. Ounsy |
+----------+----------------------------------------------------------------------------------+-----------------------------------------------------+-----------------------+
@@ -71,224 +71,242 @@ History of modifications:
+----------+----------------------------------------------------------------------------------+-----------------------------------------------------+-----------------------+
| 20/05/13 | `8.16 <http://www.tango-controls.org/static/PyTango/v803/doc/html/index.html>`_ | Update to PyTango 8.0.3 | T\. Coutinho |
+----------+----------------------------------------------------------------------------------+-----------------------------------------------------+-----------------------+
+| 28/08/13 | `8.13 <http://www.tango-controls.org/static/PyTango/v723/doc/html/index.html>`_ | Update to PyTango 7.2.4 | T\. Coutinho |
++----------+----------------------------------------------------------------------------------+-----------------------------------------------------+-----------------------+
+| 22/11/13 | `8.18 <http://www.tango-controls.org/static/PyTango/v810/doc/html/index.html>`_ | Update to PyTango 8.1.1 | T\. Coutinho |
++----------+----------------------------------------------------------------------------------+-----------------------------------------------------+-----------------------+
.. _version-history:
Version history
---------------
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| version | Changes |
-+============+==============================================================================================================================================================================+
-| 8.0.3 | Features: |
-| | - from sourceforge: |
-| | - `88: Implement Util::server_set_event_loop method in python <https://sourceforge.net/p/tango-cs/feature-requests/88>`_ |
-| | Bug fixes: |
-| | - from sourceforge: |
-| | - `3576353: [pytango] segfault on 'RestartServer' <https://sourceforge.net/tracker/?func=detail&aid=3576353&group_id=57612&atid=484769>`_ |
-| | - `3579062: [pytango] Attribute missing methods <https://sourceforge.net/tracker/?func=detail&aid=3579062&group_id=57612&atid=484769>`_ |
-| | - `3586337: [pytango] Some DeviceClass methods are not python safe <https://sourceforge.net/tracker/?func=detail&aid=3586337&group_id=57612&atid=484769>`_ |
-| | - `3598514: DeviceProxy.__setattr__ break python's descriptors <https://sourceforge.net/tracker/?func=detail&aid=3598514&group_id=57612&atid=484769>`_ |
-| | - `3607779: [pytango] IPython 0.10 error <https://sourceforge.net/tracker/?func=detail&aid=3607779&group_id=57612&atid=484769>`_ |
-| | - `598: Import DLL by PyTango failed on windows <https://sourceforge.net/p/tango-cs/bugs/598/>`_ |
-| | - `605: [pytango] use distutils.version module <https://sourceforge.net/p/tango-cs/bugs/605/>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 8.0.2 | Bug fixes: |
-| | - from sourceforge: |
-| | - `3570970: [pytango] problem during the python3 building <https://sourceforge.net/tracker/?func=detail&aid=3570970&group_id=57612&atid=484769>`_ |
-| | - `3570971: [pytango] itango does not work without qtconsole <https://sourceforge.net/tracker/?func=detail&aid=3570971&group_id=57612&atid=484769>`_ |
-| | - `3570972: [pytango] warning/error when building 8.0.0 <https://sourceforge.net/tracker/?func=detail&aid=3570972&group_id=57612&atid=484769>`_ |
-| | - `3570975: [pytango] problem during use of python3 version <https://sourceforge.net/tracker/?func=detail&aid=3570975&group_id=57612&atid=484769>`_ |
-| | - `3574099: [pytango] compile error with gcc < 4.5 <https://sourceforge.net/tracker/?func=detail&aid=3574099&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 8.0.1 | *SKIPPED* |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 8.0.0 | Features: |
-| | - Implemented tango C++ 8.0 API |
-| | - Python 3k compatible |
-| | Bug fixes: |
-| | - from sourceforge: |
-| | - `3023857: DevEncoded write attribute not supported <https://sourceforge.net/tracker/?func=detail&aid=3023857&group_id=57612&atid=484769>`_ |
-| | - `3521545: [pytango] problem with tango profile <https://sourceforge.net/tracker/?func=detail&aid=3521545&group_id=57612&atid=484769>`_ |
-| | - `3530535: PyTango group writting fails <https://sourceforge.net/tracker/?func=detail&aid=3530535&group_id=57612&atid=484769>`_ |
-| | - `3564959: EncodedAttribute.encode_xxx() methods don't accept bytearray <https://sourceforge.net/tracker/?func=detail&aid=3564959&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.2.3 | Features: |
-| | - from sourceforge: |
-| | - `3495607: DeviceClass.device_name_factory is missing <https://sourceforge.net/tracker/?func=detail&aid=3495607&group_id=57612&atid=484772>`_ |
-| | Bug fixes: |
-| | - from sourceforge: |
-| | - `3103588: documentation of PyTango.Attribute.Group <https://sourceforge.net/tracker/?func=detail&aid=3103588&group_id=57612&atid=484769>`_ |
-| | - `3458336: Problem with pytango 7.2.2 <https://sourceforge.net/tracker/?func=detail&aid=3458336&group_id=57612&atid=484769>`_ |
-| | - `3463377: PyTango memory leak in read encoded attribute <https://sourceforge.net/tracker/?func=detail&aid=3463377&group_id=57612&atid=484769>`_ |
-| | - `3487930: [pytango] wrong python dependency <https://sourceforge.net/tracker/?func=detail&aid=3487930&group_id=57612&atid=484769>`_ |
-| | - `3511509: Attribute.set_value_date_quality for encoded does not work <https://sourceforge.net/tracker/?func=detail&aid=3511509&group_id=57612&atid=484769>`_ |
-| | - `3514457: [pytango] TANGO_HOST multi-host support <https://sourceforge.net/tracker/?func=detail&aid=3514457&group_id=57612&atid=484769>`_ |
-| | - `3520739: command_history(...) in PyTango <https://sourceforge.net/tracker/?func=detail&aid=3520739&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.2.2 | Features: |
-| | - from sourceforge: |
-| | - `3305251: DS dynamic attributes discards some Attr properties <https://sourceforge.net/tracker/?func=detail&aid=3305251&group_id=57612&atid=484769>`_ |
-| | - `3365792: DeviceProxy.<cmd_name> could be documented <https://sourceforge.net/tracker/?func=detail&aid=3365792&group_id=57612&atid=484772>`_ |
-| | - `3386079: add support for ipython 0.11 <https://sourceforge.net/tracker/?func=detail&aid=3386079&group_id=57612&atid=484772>`_ |
-| | - `3437654: throw python exception as tango exception <https://sourceforge.net/tracker/?func=detail&aid=3437654&group_id=57612&atid=484772>`_ |
-| | - `3447477: spock profile installation <https://sourceforge.net/tracker/?func=detail&aid=3447477&group_id=57612&atid=484772>`_ |
-| | Bug fixes: |
-| | - from sourceforge: |
-| | - `3372371: write attribute of DevEncoded doesn't work <https://sourceforge.net/tracker/?func=detail&aid=3372371&group_id=57612&atid=484769>`_ |
-| | - `3374026: [pytango] pyflakes warning <https://sourceforge.net/tracker/?func=detail&aid=3374026&group_id=57612&atid=484769>`_ |
-| | - `3404771: PyTango.MultiAttribute.get_attribute_list missing <https://sourceforge.net/tracker/?func=detail&aid=3404771&group_id=57612&atid=484769>`_ |
-| | - `3405580: PyTango.MultiClassAttribute missing <https://sourceforge.net/tracker/?func=detail&aid=3405580&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.2.1 | *SKIPPED* |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.2.0 | Features: |
-| | - from sourceforge: |
-| | - `3286678: Add missing EncodedAttribute JPEG methods <https://sourceforge.net/tracker/?func=detail&aid=3286678&group_id=57612&atid=484772>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.1.6 | Bug fixes: |
-| | - 7.1.5 distribution is missing some files |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.1.5 | Bug fixes: |
-| | - from sourceforge: |
-| | - `3284174: 7.1.4 does not build with gcc 4.5 and tango 7.2.6 <https://sourceforge.net/tracker/?func=detail&aid=3284174&group_id=57612&atid=484769>`_ |
-| | - `3284265: [pytango][7.1.4] a few files without licence and copyright <https://sourceforge.net/tracker/?func=detail&aid=3284265&group_id=57612&atid=484769>`_ |
-| | - `3284318: copyleft vs copyright <https://sourceforge.net/tracker/?func=detail&aid=3284318&group_id=57612&atid=484769>`_ |
-| | - `3284434: [pytango][doc] few ERROR during the doc generation <https://sourceforge.net/tracker/?func=detail&aid=3284434&group_id=57612&atid=484769>`_ |
-| | - `3284435: [pytango][doc] few warning during the doc generation <https://sourceforge.net/tracker/?func=detail&aid=3284435&group_id=57612&atid=484769>`_ |
-| | - `3284440: [pytango][spock] the profile can't be installed <https://sourceforge.net/tracker/?func=detail&aid=3284440&group_id=57612&atid=484769>`_ |
-| | - `3285185: PyTango Device Server does not load Class Properties values <https://sourceforge.net/tracker/?func=detail&aid=3285185&group_id=57612&atid=484769>`_ |
-| | - `3286055: PyTango 7.1.x DS using Tango C++ 7.2.x seg faults on exit <https://sourceforge.net/tracker/?func=detail&aid=3286055&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.1.4 | Features: |
-| | - from sourceforge: |
-| | - `3274309: Generic Callback for events <https://sourceforge.net/tracker/?func=detail&aid=3274309&group_id=57612&atid=484772>`_ |
-| | |
-| | Bug fixes: |
-| | - from sourceforge: |
-| | - `3011775: Seg Faults due to removed dynamic attributes <https://sourceforge.net/tracker/?func=detail&aid=3011775&group_id=57612&atid=484769>`_ |
-| | - `3105169: PyTango 7.1.3 does not compile with Tango 7.2.X <https://sourceforge.net/tracker/?func=detail&aid=3105169&group_id=57612&atid=484769>`_ |
-| | - `3107243: spock profile does not work with python 2.5 <https://sourceforge.net/tracker/?func=detail&aid=3107243&group_id=57612&atid=484769>`_ |
-| | - `3124427: PyTango.WAttribute.set_max_value() changes min value <https://sourceforge.net/tracker/?func=detail&aid=3124427&group_id=57612&atid=484769>`_ |
-| | - `3170399: Missing documentation about is_<attr>_allowed method <https://sourceforge.net/tracker/?func=detail&aid=3170399&group_id=57612&atid=484769>`_ |
-| | - `3189082: Missing get_properties() for Attribute class <https://sourceforge.net/tracker/?func=detail&aid=3189082&group_id=57612&atid=484769>`_ |
-| | - `3196068: delete_device() not called after server_admin.Kill() <https://sourceforge.net/tracker/?func=detail&aid=3196068&group_id=57612&atid=484769>`_ |
-| | - `3257286: Binding crashes when reading a WRITE string attribute <https://sourceforge.net/tracker/?func=detail&aid=3257286&group_id=57612&atid=484769>`_ |
-| | - `3267628: DP.read_attribute(, extract=List/tuple) write value is wrong <https://sourceforge.net/tracker/?func=detail&aid=3267628&group_id=57612&atid=484769>`_ |
-| | - `3274262: Database.is_multi_tango_host missing <https://sourceforge.net/tracker/?func=detail&aid=3274262&group_id=57612&atid=484769>`_ |
-| | - `3274319: EncodedAttribute is missing in PyTango (<= 7.1.3) <https://sourceforge.net/tracker/?func=detail&aid=3274319&group_id=57612&atid=484769>`_ |
-| | - `3277269: read_attribute(DevEncoded) is not numpy as expected <https://sourceforge.net/tracker/?func=detail&aid=3277269&group_id=57612&atid=484769>`_ |
-| | - `3278946: DeviceAttribute copy constructor is not working <https://sourceforge.net/tracker/?func=detail&aid=3278946&group_id=57612&atid=484769>`_ |
-| | |
-| | Documentation: |
-| | - Added :ref:`utilities` chapter |
-| | - Added :ref:`encoded` chapter |
-| | - Improved :ref:`server` chapter |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.1.3 | Features: |
-| | - tango logging with print statement |
-| | - tango logging with decorators |
-| | - from sourceforge: |
-| | - `3060380: ApiUtil should be exported to PyTango <https://sourceforge.net/tracker/?func=detail&aid=3060380&group_id=57612&atid=484772>`_ |
-| | |
-| | Bug fixes: |
-| | - added licence header to all source code files |
-| | - spock didn't work without TANGO_HOST env. variable (it didn't recognize |
-| | tangorc) |
-| | - spock should give a proper message if it tries to be initialized outside |
-| | ipython |
-| | - from sourceforge: |
-| | - `3048798: licence issue GPL != LGPL <https://sourceforge.net/tracker/?func=detail&aid=3048798&group_id=57612&atid=484769>`_ |
-| | - `3073378: DeviceImpl.signal_handler raising exception crashes DS <https://sourceforge.net/tracker/?func=detail&aid=3073378&group_id=57612&atid=484769>`_ |
-| | - `3088031: Python DS unable to read DevVarBooleanArray property <https://sourceforge.net/tracker/?func=detail&aid=3088031&group_id=57612&atid=484769>`_ |
-| | - `3102776: PyTango 7.1.2 does not work with python 2.4 & boost 1.33.0 <https://sourceforge.net/tracker/?func=detail&aid=3102776&group_id=57612&atid=484769>`_ |
-| | - `3102778: Fix compilation warnings in linux <https://sourceforge.net/tracker/?func=detail&aid=3102778&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.1.2 | Features: |
-| | - from sourceforge: |
-| | - `2995964: Dynamic device creation <https://sourceforge.net/tracker/?func=detail&aid=2995964&group_id=57612&atid=484772>`_ |
-| | - `3010399: The DeviceClass.get_device_list that exists in C++ is missing <https://sourceforge.net/tracker/?func=detail&aid=3010399&group_id=57612&atid=484772>`_ |
-| | - `3023686: Missing DeviceProxy.<attribute name> <https://sourceforge.net/tracker/?func=detail&aid=3023686&group_id=57612&atid=484772>`_ |
-| | - `3025396: DeviceImpl is missing some CORBA methods <https://sourceforge.net/tracker/?func=detail&aid=3025396&group_id=57612&atid=484772>`_ |
-| | - `3032005: IPython extension for PyTango <https://sourceforge.net/tracker/?func=detail&aid=3032005&group_id=57612&atid=484772>`_ |
-| | - `3033476: Make client objects pickable <https://sourceforge.net/tracker/?func=detail&aid=3033476&group_id=57612&atid=484772>`_ |
-| | - `3039902: PyTango.Util.add_class would be useful <https://sourceforge.net/tracker/?func=detail&aid=3039902&group_id=57612&atid=484772>`_ |
-| | |
-| | Bug fixes: |
-| | - from sourceforge: |
-| | - `2975940: DS command with DevVarCharArray return type fails <https://sourceforge.net/tracker/?func=detail&aid=2975940&group_id=57612&atid=484769>`_ |
-| | - `3000467: DeviceProxy.unlock is LOCKING instead of unlocking! <https://sourceforge.net/tracker/?func=detail&aid=3000467&group_id=57612&atid=484769>`_ |
-| | - `3010395: Util.get_device_* methods don't work <https://sourceforge.net/tracker/?func=detail&aid=3010395&group_id=57612&atid=484769>`_ |
-| | - `3010425: Database.dev_name does not work <https://sourceforge.net/tracker/?func=detail&aid=3010425&group_id=57612&atid=484769>`_ |
-| | - `3016949: command_inout_asynch callback does not work <https://sourceforge.net/tracker/?func=detail&aid=3016949&group_id=57612&atid=484769>`_ |
-| | - `3020300: PyTango does not compile with gcc 4.1.x <https://sourceforge.net/tracker/?func=detail&aid=3020300&group_id=57612&atid=484769>`_ |
-| | - `3030399: Database put(delete)_attribute_alias generates segfault <https://sourceforge.net/tracker/?func=detail&aid=3030399&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.1.1 | Features: |
-| | - Improved setup script |
-| | - Interfaced with PyPI |
-| | - Cleaned build script warnings due to unclean python C++ macro definitions |
-| | - from sourceforge: |
-| | - `2985993: PyTango numpy command support <https://sourceforge.net/tracker/?func=detail&aid=2985993&group_id=57612&atid=484772>`_ |
-| | - `2971217: PyTango.GroupAttrReplyList slicing <https://sourceforge.net/tracker/?func=detail&aid=2971217&group_id=57612&atid=484772>`_ |
-| | |
-| | Bug fixes: |
-| | - from sourceforge: |
-| | - `2983299: Database.put_property() deletes the property <https://sourceforge.net/tracker/?func=detail&aid=2983299&group_id=57612&atid=484769>`_ |
-| | - `2953689: can not write_attribute scalar/spectrum/image <https://sourceforge.net/tracker/?func=detail&aid=2953689&group_id=57612&atid=484769>`_ |
-| | - `2953030: PyTango doc installation <https://sourceforge.net/tracker/?func=detail&aid=2953030&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.1.0 | Features: |
-| | - from sourceforge: |
-| | - `2908176: read_*, write_* and is_*_allowed() methods can now be defined <https://sourceforge.net/tracker/?func=detail&aid=2908176&group_id=57612&atid=484772>`_ |
-| | - `2941036: TimeVal conversion to time and datetime <https://sourceforge.net/tracker/?func=detail&aid=2941036&group_id=57612&atid=484772>`_ |
-| | - added str representation on Attr, Attribute, DeviceImpl and DeviceClass |
-| | |
-| | Bug fixes: |
-| | - from sourceforge: |
-| | - `2903755: get_device_properties() bug reading DevString properties <https://sourceforge.net/tracker/?func=detail&aid=2903755group_id=57612&atid=484769>`_ |
-| | - `2909927: PyTango.Group.read_attribute() return values <https://sourceforge.net/tracker/?func=detail&aid=2909927&group_id=57612&atid=484769>`_ |
-| | - `2914194: DevEncoded does not work <https://sourceforge.net/tracker/?func=detail&aid=2914194&group_id=57612&atid=484769>`_ |
-| | - `2916397: PyTango.DeviceAttribute copy constructor does not work <https://sourceforge.net/tracker/?func=detail&aid=2916397&group_id=57612&atid=484769>`_ |
-| | - `2936173: PyTango.Group.read_attributes() fails <https://sourceforge.net/tracker/?func=detail&aid=2936173&group_id=57612&atid=484769>`_ |
-| | - `2949099: Missing PyTango.Except.print_error_stack <https://sourceforge.net/tracker/?func=detail&aid=2949099&group_id=57612&atid=484769>`_ |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| 7.1.0rc1 | Features: |
-| | - v = image_attribute.get_write_value() returns square sequences (arrays of |
-| | arrays, or numpy objects) now instead of flat lists. Also for spectrum |
-| | attributes a numpy is returned by default now instead. |
-| | - image_attribute.set_value(v) accepts numpy arrays now or square sequences |
-| | instead of just flat lists. So, dim_x and dim_y are useless now. Also the |
-| | numpy path is faster. |
-| | - new enum AttrSerialModel |
-| | - Attribute new methods: set(get)_attr_serial_model, set_change_event, |
-| | set_archive_event, is_change_event, is_check_change_event, |
-| | is_archive_criteria, is_check_archive_criteria, remove_configuration |
-| | - added support for numpy scalars in tango operations like write_attribute |
-| | (ex: now a DEV_LONG attribute can receive a numpy.int32 argument in a |
-| | write_attribute method call) |
-| | |
-| | Bug fixes: |
-| | - DeviceImpl.set_value for scalar attributes |
-| | - DeviceImpl.push_***_event |
-| | - server commands with DevVar***StringArray as parameter or as return type |
-| | - in windows,a bug in PyTango.Util prevented servers from starting up |
-| | - DeviceImpl.get_device_properties for string properties assigns only first |
-| | character of string to object member instead of entire string |
-| | - added missing methods to Util |
-| | - exported SubDevDiag class |
-| | - error in read/events of attributes of type DevBoolean READ_WRITE |
-| | - error in automatic unsubscribe events of DeviceProxy when the object |
-| | disapears (happens only on some compilers with some optimization flags) |
-| | - fix possible bug when comparing attribute names in DeviceProxy |
-| | - pretty print of DevFailed -> fix deprecation warning in python 2.6 |
-| | - device class properties where not properly fetched when there is no |
-| | property value defined |
-| | - memory leak when converting DevFailed exceptions from C++ to python |
-| | - python device server file without extension does not start |
-| | |
-| | Documentation: |
-| | - Improved FAQ |
-| | - Improved compilation chapter |
-| | - Improved migration information |
-+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| version | Changes |
++==========+===================================================================================================================================================================+
+| 8.1.1 | Features: |
+| | - Implemented tango C++ 8.1 API |
+| | |
+| | Bug fixes: |
+| | - `527: set_value() for ULong64 <https://sourceforge.net/p/tango-cs/bugs/527/>`_ |
+| | - `573: [pytango] python3 error with unregistered device <https://sourceforge.net/p/tango-cs/bugs/573/>`_ |
+| | - `611: URGENT fail to write attribute with PyTango 8.0.3 <https://sourceforge.net/p/tango-cs/bugs/611/>`_ |
+| | - `612: [pytango][8.0.3] failed to build from source on s390 <https://sourceforge.net/p/tango-cs/bugs/612/>`_ |
+| | - `615: Threading problem when setting a DevULong64 attribute <https://sourceforge.net/p/tango-cs/bugs/615/>`_ |
+| | - `622: PyTango broken when running on Ubuntu 13 <https://sourceforge.net/p/tango-cs/bugs/622/>`_ |
+| | - `626: attribute_history extraction can raised an exception <https://sourceforge.net/p/tango-cs/bugs/626/>`_ |
+| | - `628: Problem in installing PyTango 8.0.3 on Scientific Linux 6 <https://sourceforge.net/p/tango-cs/bugs/628/>`_ |
+| | - `635: Reading of ULong64 attributes does not work <https://sourceforge.net/p/tango-cs/bugs/635/>`_ |
+| | - `636: PyTango log messages are not filtered by level <https://sourceforge.net/p/tango-cs/bugs/636/>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 8.1.0 | *SKIPPED* |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 8.0.3 | Features: |
+| | - `88: Implement Util::server_set_event_loop method in python <https://sourceforge.net/p/tango-cs/feature-requests/88>`_ |
+| | |
+| | Bug fixes: |
+| | - `3576353: [pytango] segfault on 'RestartServer' <https://sourceforge.net/tracker/?func=detail&aid=3576353&group_id=57612&atid=484769>`_ |
+| | - `3579062: [pytango] Attribute missing methods <https://sourceforge.net/tracker/?func=detail&aid=3579062&group_id=57612&atid=484769>`_ |
+| | - `3586337: [pytango] Some DeviceClass methods are not python safe <https://sourceforge.net/tracker/?func=detail&aid=3586337&group_id=57612&atid=484769>`_ |
+| | - `3598514: DeviceProxy.__setattr__ break python's descriptors <https://sourceforge.net/tracker/?func=detail&aid=3598514&group_id=57612&atid=484769>`_ |
+| | - `3607779: [pytango] IPython 0.10 error <https://sourceforge.net/tracker/?func=detail&aid=3607779&group_id=57612&atid=484769>`_ |
+| | - `598: Import DLL by PyTango failed on windows <https://sourceforge.net/p/tango-cs/bugs/598/>`_ |
+| | - `605: [pytango] use distutils.version module <https://sourceforge.net/p/tango-cs/bugs/605/>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 8.0.2 | Bug fixes: |
+| | - `3570970: [pytango] problem during the python3 building <https://sourceforge.net/tracker/?func=detail&aid=3570970&group_id=57612&atid=484769>`_ |
+| | - `3570971: [pytango] itango does not work without qtconsole <https://sourceforge.net/tracker/?func=detail&aid=3570971&group_id=57612&atid=484769>`_ |
+| | - `3570972: [pytango] warning/error when building 8.0.0 <https://sourceforge.net/tracker/?func=detail&aid=3570972&group_id=57612&atid=484769>`_ |
+| | - `3570975: [pytango] problem during use of python3 version <https://sourceforge.net/tracker/?func=detail&aid=3570975&group_id=57612&atid=484769>`_ |
+| | - `3574099: [pytango] compile error with gcc < 4.5 <https://sourceforge.net/tracker/?func=detail&aid=3574099&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 8.0.1 | *SKIPPED* |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 8.0.0 | Features: |
+| | - Implemented tango C++ 8.0 API |
+| | - Python 3k compatible |
+| | Bug fixes: |
+| | - `3023857: DevEncoded write attribute not supported <https://sourceforge.net/tracker/?func=detail&aid=3023857&group_id=57612&atid=484769>`_ |
+| | - `3521545: [pytango] problem with tango profile <https://sourceforge.net/tracker/?func=detail&aid=3521545&group_id=57612&atid=484769>`_ |
+| | - `3530535: PyTango group writting fails <https://sourceforge.net/tracker/?func=detail&aid=3530535&group_id=57612&atid=484769>`_ |
+| | - `3564959: EncodedAttribute.encode_xxx() methods don't accept bytearray <https://sourceforge.net/tracker/?func=detail&aid=3564959&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.2.4 | Bug fixes: |
+| | - from sourceforge: |
+| | - `551: [pytango] Some DeviceClass methods are not python safe <https://sourceforge.net/p/tango-cs/bugs/551/>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.2.3 | Features: |
+| | - `3495607: DeviceClass.device_name_factory is missing <https://sourceforge.net/tracker/?func=detail&aid=3495607&group_id=57612&atid=484772>`_ |
+| | |
+| | Bug fixes: |
+| | - `3103588: documentation of PyTango.Attribute.Group <https://sourceforge.net/tracker/?func=detail&aid=3103588&group_id=57612&atid=484769>`_ |
+| | - `3458336: Problem with pytango 7.2.2 <https://sourceforge.net/tracker/?func=detail&aid=3458336&group_id=57612&atid=484769>`_ |
+| | - `3463377: PyTango memory leak in read encoded attribute <https://sourceforge.net/tracker/?func=detail&aid=3463377&group_id=57612&atid=484769>`_ |
+| | - `3487930: [pytango] wrong python dependency <https://sourceforge.net/tracker/?func=detail&aid=3487930&group_id=57612&atid=484769>`_ |
+| | - `3511509: Attribute.set_value_date_quality for encoded does not work <https://sourceforge.net/tracker/?func=detail&aid=3511509&group_id=57612&atid=484769>`_ |
+| | - `3514457: [pytango] TANGO_HOST multi-host support <https://sourceforge.net/tracker/?func=detail&aid=3514457&group_id=57612&atid=484769>`_ |
+| | - `3520739: command_history(...) in PyTango <https://sourceforge.net/tracker/?func=detail&aid=3520739&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.2.2 | Features: |
+| | - `3305251: DS dynamic attributes discards some Attr properties <https://sourceforge.net/tracker/?func=detail&aid=3305251&group_id=57612&atid=484769>`_ |
+| | - `3365792: DeviceProxy.<cmd_name> could be documented <https://sourceforge.net/tracker/?func=detail&aid=3365792&group_id=57612&atid=484772>`_ |
+| | - `3386079: add support for ipython 0.11 <https://sourceforge.net/tracker/?func=detail&aid=3386079&group_id=57612&atid=484772>`_ |
+| | - `3437654: throw python exception as tango exception <https://sourceforge.net/tracker/?func=detail&aid=3437654&group_id=57612&atid=484772>`_ |
+| | - `3447477: spock profile installation <https://sourceforge.net/tracker/?func=detail&aid=3447477&group_id=57612&atid=484772>`_ |
+| | |
+| | Bug fixes: |
+| | - `3372371: write attribute of DevEncoded doesn't work <https://sourceforge.net/tracker/?func=detail&aid=3372371&group_id=57612&atid=484769>`_ |
+| | - `3374026: [pytango] pyflakes warning <https://sourceforge.net/tracker/?func=detail&aid=3374026&group_id=57612&atid=484769>`_ |
+| | - `3404771: PyTango.MultiAttribute.get_attribute_list missing <https://sourceforge.net/tracker/?func=detail&aid=3404771&group_id=57612&atid=484769>`_ |
+| | - `3405580: PyTango.MultiClassAttribute missing <https://sourceforge.net/tracker/?func=detail&aid=3405580&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.2.1 | *SKIPPED* |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.2.0 | Features: |
+| | - from sourceforge: |
+| | - `3286678: Add missing EncodedAttribute JPEG methods <https://sourceforge.net/tracker/?func=detail&aid=3286678&group_id=57612&atid=484772>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.1.6 | Bug fixes: |
+| | - 7.1.5 distribution is missing some files |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.1.5 | Bug fixes: |
+| | - from sourceforge: |
+| | - `3284174: 7.1.4 does not build with gcc 4.5 and tango 7.2.6 <https://sourceforge.net/tracker/?func=detail&aid=3284174&group_id=57612&atid=484769>`_ |
+| | - `3284265: [pytango][7.1.4] a few files without licence and copyright <https://sourceforge.net/tracker/?func=detail&aid=3284265&group_id=57612&atid=484769>`_ |
+| | - `3284318: copyleft vs copyright <https://sourceforge.net/tracker/?func=detail&aid=3284318&group_id=57612&atid=484769>`_ |
+| | - `3284434: [pytango][doc] few ERROR during the doc generation <https://sourceforge.net/tracker/?func=detail&aid=3284434&group_id=57612&atid=484769>`_ |
+| | - `3284435: [pytango][doc] few warning during the doc generation <https://sourceforge.net/tracker/?func=detail&aid=3284435&group_id=57612&atid=484769>`_ |
+| | - `3284440: [pytango][spock] the profile can't be installed <https://sourceforge.net/tracker/?func=detail&aid=3284440&group_id=57612&atid=484769>`_ |
+| | - `3285185: PyTango Device Server does not load Class Properties values <https://sourceforge.net/tracker/?func=detail&aid=3285185&group_id=57612&atid=484769>`_ |
+| | - `3286055: PyTango 7.1.x DS using Tango C++ 7.2.x seg faults on exit <https://sourceforge.net/tracker/?func=detail&aid=3286055&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.1.4 | Features: |
+| | - `3274309: Generic Callback for events <https://sourceforge.net/tracker/?func=detail&aid=3274309&group_id=57612&atid=484772>`_ |
+| | |
+| | Bug fixes: |
+| | - `3011775: Seg Faults due to removed dynamic attributes <https://sourceforge.net/tracker/?func=detail&aid=3011775&group_id=57612&atid=484769>`_ |
+| | - `3105169: PyTango 7.1.3 does not compile with Tango 7.2.X <https://sourceforge.net/tracker/?func=detail&aid=3105169&group_id=57612&atid=484769>`_ |
+| | - `3107243: spock profile does not work with python 2.5 <https://sourceforge.net/tracker/?func=detail&aid=3107243&group_id=57612&atid=484769>`_ |
+| | - `3124427: PyTango.WAttribute.set_max_value() changes min value <https://sourceforge.net/tracker/?func=detail&aid=3124427&group_id=57612&atid=484769>`_ |
+| | - `3170399: Missing documentation about is_<attr>_allowed method <https://sourceforge.net/tracker/?func=detail&aid=3170399&group_id=57612&atid=484769>`_ |
+| | - `3189082: Missing get_properties() for Attribute class <https://sourceforge.net/tracker/?func=detail&aid=3189082&group_id=57612&atid=484769>`_ |
+| | - `3196068: delete_device() not called after server_admin.Kill() <https://sourceforge.net/tracker/?func=detail&aid=3196068&group_id=57612&atid=484769>`_ |
+| | - `3257286: Binding crashes when reading a WRITE string attribute <https://sourceforge.net/tracker/?func=detail&aid=3257286&group_id=57612&atid=484769>`_ |
+| | - `3267628: DP.read_attribute(, extract=List/tuple) write value is wrong <https://sourceforge.net/tracker/?func=detail&aid=3267628&group_id=57612&atid=484769>`_ |
+| | - `3274262: Database.is_multi_tango_host missing <https://sourceforge.net/tracker/?func=detail&aid=3274262&group_id=57612&atid=484769>`_ |
+| | - `3274319: EncodedAttribute is missing in PyTango (<= 7.1.3) <https://sourceforge.net/tracker/?func=detail&aid=3274319&group_id=57612&atid=484769>`_ |
+| | - `3277269: read_attribute(DevEncoded) is not numpy as expected <https://sourceforge.net/tracker/?func=detail&aid=3277269&group_id=57612&atid=484769>`_ |
+| | - `3278946: DeviceAttribute copy constructor is not working <https://sourceforge.net/tracker/?func=detail&aid=3278946&group_id=57612&atid=484769>`_ |
+| | |
+| | Documentation: |
+| | - Added :ref:`utilities` chapter |
+| | - Added :ref:`encoded` chapter |
+| | - Improved :ref:`server` chapter |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.1.3 | Features: |
+| | - tango logging with print statement |
+| | - tango logging with decorators |
+| | - from sourceforge: |
+| | - `3060380: ApiUtil should be exported to PyTango <https://sourceforge.net/tracker/?func=detail&aid=3060380&group_id=57612&atid=484772>`_ |
+| | |
+| | Bug fixes: |
+| | - added licence header to all source code files |
+| | - spock didn't work without TANGO_HOST env. variable (it didn't recognize |
+| | tangorc) |
+| | - spock should give a proper message if it tries to be initialized outside |
+| | ipython |
+| | - from sourceforge: |
+| | - `3048798: licence issue GPL != LGPL <https://sourceforge.net/tracker/?func=detail&aid=3048798&group_id=57612&atid=484769>`_ |
+| | - `3073378: DeviceImpl.signal_handler raising exception crashes DS <https://sourceforge.net/tracker/?func=detail&aid=3073378&group_id=57612&atid=484769>`_ |
+| | - `3088031: Python DS unable to read DevVarBooleanArray property <https://sourceforge.net/tracker/?func=detail&aid=3088031&group_id=57612&atid=484769>`_ |
+| | - `3102776: PyTango 7.1.2 does not work with python 2.4 & boost 1.33.0 <https://sourceforge.net/tracker/?func=detail&aid=3102776&group_id=57612&atid=484769>`_ |
+| | - `3102778: Fix compilation warnings in linux <https://sourceforge.net/tracker/?func=detail&aid=3102778&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.1.2 | Features: |
+| | - from sourceforge: |
+| | - `2995964: Dynamic device creation <https://sourceforge.net/tracker/?func=detail&aid=2995964&group_id=57612&atid=484772>`_ |
+| | - `3010399: The DeviceClass.get_device_list that exists in C++ is missing <https://sourceforge.net/tracker/?func=detail&aid=3010399&group_id=57612&atid=484772>`_ |
+| | - `3023686: Missing DeviceProxy.<attribute name> <https://sourceforge.net/tracker/?func=detail&aid=3023686&group_id=57612&atid=484772>`_ |
+| | - `3025396: DeviceImpl is missing some CORBA methods <https://sourceforge.net/tracker/?func=detail&aid=3025396&group_id=57612&atid=484772>`_ |
+| | - `3032005: IPython extension for PyTango <https://sourceforge.net/tracker/?func=detail&aid=3032005&group_id=57612&atid=484772>`_ |
+| | - `3033476: Make client objects pickable <https://sourceforge.net/tracker/?func=detail&aid=3033476&group_id=57612&atid=484772>`_ |
+| | - `3039902: PyTango.Util.add_class would be useful <https://sourceforge.net/tracker/?func=detail&aid=3039902&group_id=57612&atid=484772>`_ |
+| | |
+| | Bug fixes: |
+| | - from sourceforge: |
+| | - `2975940: DS command with DevVarCharArray return type fails <https://sourceforge.net/tracker/?func=detail&aid=2975940&group_id=57612&atid=484769>`_ |
+| | - `3000467: DeviceProxy.unlock is LOCKING instead of unlocking! <https://sourceforge.net/tracker/?func=detail&aid=3000467&group_id=57612&atid=484769>`_ |
+| | - `3010395: Util.get_device_* methods don't work <https://sourceforge.net/tracker/?func=detail&aid=3010395&group_id=57612&atid=484769>`_ |
+| | - `3010425: Database.dev_name does not work <https://sourceforge.net/tracker/?func=detail&aid=3010425&group_id=57612&atid=484769>`_ |
+| | - `3016949: command_inout_asynch callback does not work <https://sourceforge.net/tracker/?func=detail&aid=3016949&group_id=57612&atid=484769>`_ |
+| | - `3020300: PyTango does not compile with gcc 4.1.x <https://sourceforge.net/tracker/?func=detail&aid=3020300&group_id=57612&atid=484769>`_ |
+| | - `3030399: Database put(delete)_attribute_alias generates segfault <https://sourceforge.net/tracker/?func=detail&aid=3030399&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.1.1 | Features: |
+| | - Improved setup script |
+| | - Interfaced with PyPI |
+| | - Cleaned build script warnings due to unclean python C++ macro definitions |
+| | - from sourceforge: |
+| | - `2985993: PyTango numpy command support <https://sourceforge.net/tracker/?func=detail&aid=2985993&group_id=57612&atid=484772>`_ |
+| | - `2971217: PyTango.GroupAttrReplyList slicing <https://sourceforge.net/tracker/?func=detail&aid=2971217&group_id=57612&atid=484772>`_ |
+| | |
+| | Bug fixes: |
+| | - from sourceforge: |
+| | - `2983299: Database.put_property() deletes the property <https://sourceforge.net/tracker/?func=detail&aid=2983299&group_id=57612&atid=484769>`_ |
+| | - `2953689: can not write_attribute scalar/spectrum/image <https://sourceforge.net/tracker/?func=detail&aid=2953689&group_id=57612&atid=484769>`_ |
+| | - `2953030: PyTango doc installation <https://sourceforge.net/tracker/?func=detail&aid=2953030&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.1.0 | Features: |
+| | - from sourceforge: |
+| | - `2908176: read_*, write_* and is_*_allowed() methods can now be defined <https://sourceforge.net/tracker/?func=detail&aid=2908176&group_id=57612&atid=484772>`_ |
+| | - `2941036: TimeVal conversion to time and datetime <https://sourceforge.net/tracker/?func=detail&aid=2941036&group_id=57612&atid=484772>`_ |
+| | - added str representation on Attr, Attribute, DeviceImpl and DeviceClass |
+| | |
+| | Bug fixes: |
+| | - from sourceforge: |
+| | - `2903755: get_device_properties() bug reading DevString properties <https://sourceforge.net/tracker/?func=detail&aid=2903755group_id=57612&atid=484769>`_ |
+| | - `2909927: PyTango.Group.read_attribute() return values <https://sourceforge.net/tracker/?func=detail&aid=2909927&group_id=57612&atid=484769>`_ |
+| | - `2914194: DevEncoded does not work <https://sourceforge.net/tracker/?func=detail&aid=2914194&group_id=57612&atid=484769>`_ |
+| | - `2916397: PyTango.DeviceAttribute copy constructor does not work <https://sourceforge.net/tracker/?func=detail&aid=2916397&group_id=57612&atid=484769>`_ |
+| | - `2936173: PyTango.Group.read_attributes() fails <https://sourceforge.net/tracker/?func=detail&aid=2936173&group_id=57612&atid=484769>`_ |
+| | - `2949099: Missing PyTango.Except.print_error_stack <https://sourceforge.net/tracker/?func=detail&aid=2949099&group_id=57612&atid=484769>`_ |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| 7.1.0rc1 | Features: |
+| | - v = image_attribute.get_write_value() returns square sequences (arrays of |
+| | arrays, or numpy objects) now instead of flat lists. Also for spectrum |
+| | attributes a numpy is returned by default now instead. |
+| | - image_attribute.set_value(v) accepts numpy arrays now or square sequences |
+| | instead of just flat lists. So, dim_x and dim_y are useless now. Also the |
+| | numpy path is faster. |
+| | - new enum AttrSerialModel |
+| | - Attribute new methods: set(get)_attr_serial_model, set_change_event, |
+| | set_archive_event, is_change_event, is_check_change_event, |
+| | is_archive_criteria, is_check_archive_criteria, remove_configuration |
+| | - added support for numpy scalars in tango operations like write_attribute |
+| | (ex: now a DEV_LONG attribute can receive a numpy.int32 argument in a |
+| | write_attribute method call) |
+| | |
+| | Bug fixes: |
+| | - DeviceImpl.set_value for scalar attributes |
+| | - DeviceImpl.push_***_event |
+| | - server commands with DevVar***StringArray as parameter or as return type |
+| | - in windows,a bug in PyTango.Util prevented servers from starting up |
+| | - DeviceImpl.get_device_properties for string properties assigns only first |
+| | character of string to object member instead of entire string |
+| | - added missing methods to Util |
+| | - exported SubDevDiag class |
+| | - error in read/events of attributes of type DevBoolean READ_WRITE |
+| | - error in automatic unsubscribe events of DeviceProxy when the object |
+| | disapears (happens only on some compilers with some optimization flags) |
+| | - fix possible bug when comparing attribute names in DeviceProxy |
+| | - pretty print of DevFailed -> fix deprecation warning in python 2.6 |
+| | - device class properties where not properly fetched when there is no |
+| | property value defined |
+| | - memory leak when converting DevFailed exceptions from C++ to python |
+| | - python device server file without extension does not start |
+| | |
+| | Documentation: |
+| | - Improved FAQ |
+| | - Improved compilation chapter |
+| | - Improved migration information |
++----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
diff --git a/doc/server/index.rst b/doc/server/index.rst
index 1a3894e..d437c04 100644
--- a/doc/server/index.rst
+++ b/doc/server/index.rst
@@ -1,4 +1,3 @@
-
.. currentmodule:: PyTango
.. highlight:: python
@@ -6,8 +5,8 @@
.. _server:
-The Tango Device Server Python API
-==================================
+Server API
+==========
This chapter does not explain what a Tango device or a device server is.
This is explained in details in "The Tango control system manual" available at
@@ -185,7 +184,8 @@ array:
+-------------------+-----------------------------------+------------------------------------------+
|"polling period" | Any number | The attribute polling period (mS) |
+-------------------+-----------------------------------+------------------------------------------+
- | "memorized" | True or True_without_hard_applied | Define if and how the att. is memorized |
+ | "memorized" | "true" or | Define if and how the att. is memorized |
+ | | "true_without_hard_applied" | |
+-------------------+-----------------------------------+------------------------------------------+
| "label" | A string | The attribute label |
+-------------------+-----------------------------------+------------------------------------------+
@@ -393,177 +393,8 @@ The following array gives some more info on these methods.
| Cmd_name | Depends on cmd type |Depends on cmd type | Yes |
+-----------------------+-------------------------+--------------------+-----------+
-Tango has more data types than Python which is more dynamic. The input and
-output values of the commands are translated according to the array below.
-Note that if PyTango is compiled with :py:mod:`numpy` support the numpy type
-will be the used for the input arguments. Also, it is recomended to use numpy
-arrays of the appropiate type for output arguments as well, as it is much more
-efficient.
-
-**For scalar types**
-
-+-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| Tango data type | Python 2.x type | Python 3.x type (*New in PyTango 8.0*) |
-+=========================+===========================================================================+===========================================================================+
-| DEV_VOID | No data | No data |
-+-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEV_BOOLEAN | :py:obj:`bool` | :py:obj:`bool` |
-+-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEV_SHORT | :py:obj:`int` | :py:obj:`int` |
-+-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEV_LONG | :py:obj:`int` | :py:obj:`int` |
-+-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEV_LONG64 | - :py:obj:`long` (on a 32 bits computer) | :py:obj:`int` |
-| | - :py:obj:`int` (on a 64 bits computer) | |
-+-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEV_FLOAT | :py:obj:`float` | :py:obj:`float` |
-+-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEV_DOUBLE | :py:obj:`float` | :py:obj:`float` |
-+-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEV_USHORT | :py:obj:`int` | :py:obj:`int` |
-+-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEV_ULONG | :py:obj:`int` | :py:obj:`int` |
-+-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEV_ULONG64 | * :py:obj:`long` (on a 32 bits computer) | :py:obj:`int` |
-| | * :py:obj:`int` (on a 64 bits computer) | |
-+-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEV_STRING | :py:obj:`str` | :py:obj:`str` (decoded with *latin-1*, aka *ISO-8859-1*) |
-+-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | sequence of two elements: | sequence of two elements: |
-| DEV_ENCODED | | |
-| (*New in PyTango 8.0*) | 0. :py:obj:`str` | 0. :py:obj:`str` (decoded with *latin-1*, aka *ISO-8859-1*) |
-| | 1. :py:obj:`bytes` (for any value of *extract_as*) | 1. :py:obj:`bytes` (for any value of *extract_as*, except String. |
-| | | In this case it is :py:obj:`str` (decoded with default python |
-| | | encoding *utf-8*)) |
-+-------------------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-
-**For array types**
-
-+-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| Tango data type | ExtractAs | Data type (Python 2.x) | Data type (Python 3.x) (*New in PyTango 8.0*) |
-+=========================+=================+===========================================================================+===========================================================================+
-| DEVVAR_CHARARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint8`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint8`) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | List | :py:class:`list` <:py:obj:`int`> | :py:class:`list` <:py:obj:`int`> |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Tuple | :py:class:`tuple` <:py:obj:`int`> | :py:class:`tuple` <:py:obj:`int`> |
-+-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEVVAR_SHORTARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint16`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint16`) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | List | :py:class:`list` <:py:obj:`int`> | :py:class:`list` <:py:obj:`int`> |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Tuple | :py:class:`tuple` <:py:obj:`int`> | :py:class:`tuple` <:py:obj:`int`> |
-+-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEVVAR_LONGARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint32`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint32`) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | List | :py:class:`list` <:py:obj:`int`> | :py:class:`list` <:py:obj:`int`> |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Tuple | :py:class:`tuple` <:py:obj:`int`> | :py:class:`tuple` <:py:obj:`int`> |
-+-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEVVAR_LONG64ARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint64`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint64`) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | List | :py:class:`list` <int (64 bits) / long (32 bits)> | :py:class:`list` <:py:obj:`int`> |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Tuple | :py:class:`tuple` <int (64 bits) / long (32 bits)> | :py:class:`tuple` <:py:obj:`int`> |
-+-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEVVAR_FLOATARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.float32`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.float32`) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | List | :py:class:`list` <:py:obj:`float`> | :py:class:`list` <:py:obj:`float`> |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Tuple | :py:class:`tuple` <:py:obj:`float`> | :py:class:`tuple` <:py:obj:`float`> |
-+-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEVVAR_DOUBLEARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.float64`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.float64`) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | List | :py:class:`list` <:py:obj:`float`> | :py:class:`list` <:py:obj:`float`> |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Tuple | :py:class:`tuple` <:py:obj:`float`> | :py:class:`tuple` <:py:obj:`float`> |
-+-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEVVAR_USHORTARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint16`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint16`) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | List | :py:class:`list` <:py:obj:`int`> | :py:class:`list` <:py:obj:`int`> |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Tuple | :py:class:`tuple` <:py:obj:`int`> | :py:class:`tuple` <:py:obj:`int`> |
-+-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEVVAR_ULONGARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint32`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint32`) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | List | :py:class:`list` <:py:obj:`int`> | :py:class:`list` <:py:obj:`int`> |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Tuple | :py:class:`tuple` <:py:obj:`int`> | :py:class:`tuple` <:py:obj:`int`> |
-+-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEVVAR_ULONG64ARRAY | Numpy | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint64`) | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint64`) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Bytes | :py:obj:`bytes` (which is in fact equal to :py:obj:`str`) | :py:obj:`bytes` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | ByteArray | :py:obj:`bytearray` | :py:obj:`bytearray` |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | String | :py:obj:`str` | String :py:obj:`str` (decoded with default python encoding *utf-8*!!!) |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | List | :py:class:`list` <int (64 bits) / long (32 bits)> | :py:class:`list` <:py:obj:`int`> |
-| +-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | Tuple | :py:class:`tuple` <int (64 bits) / long (32 bits)> | :py:class:`tuple` <:py:obj:`int`> |
-+-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| DEVVAR_STRINGARRAY | | sequence<:py:obj:`str`> | sequence<:py:obj:`str`> (decoded with *latin-1*, aka *ISO-8859-1*) |
-+-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | | sequence of two elements: | sequence of two elements: |
-| DEV_LONGSTRINGARRAY | | | |
-| | | 0. :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.int32`) or | 0. :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.int32`) or |
-| | | sequence<:py:obj:`int`> | sequence<:py:obj:`int`> |
-| | | 1. sequence<:py:obj:`str`> | 1. sequence<:py:obj:`str`> (decoded with *latin-1*, aka *ISO-8859-1*) |
-+-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
-| | | sequence of two elements: | sequence of two elements: |
-| DEV_DOUBLESTRINGARRAY | | | |
-| | | 0. :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.float64`) or | 0. :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.float64`) or |
-| | | sequence<:py:obj:`int`> | sequence<:py:obj:`int`> |
-| | | 1. sequence<:py:obj:`str`> | 1. sequence<:py:obj:`str`> (decoded with *latin-1*, aka *ISO-8859-1*) |
-+-------------------------+-----------------+---------------------------------------------------------------------------+---------------------------------------------------------------------------+
+Please check :ref:`pytango-data-types` chapter to understand the data types
+that can be used in command parameters and return values.
The following code is an example of how you write code executed when a client
calls a command named IOLong::
@@ -610,83 +441,10 @@ its write method has to be called *write_MyAttr*.
The *attr* parameter is an instance of :class:`Attr`.
Unlike the commands, the is_allowed method for attributes receives a parameter
of type :class:`AttReqtype`.
-The following table gives some more info on these methods:
-
-.. html:
- +-------------+-------------+--------------------------------------------------------------+
- | data format | data type | python type |
- +=============+=============+==============================================================+
- | SCALAR | DEV_BOOLEAN | :py:obj:`bool` |
- |-------------+-------------+--------------------------------------------------------------+
- | SCALAR | DEV_UCHAR | :py:obj:`int` |
- +-------------+-------------+--------------------------------------------------------------+
- | SCALAR | DEV_SHORT | :py:obj:`int` |
- +-------------+-------------+--------------------------------------------------------------+
- | SCALAR | DEV_USHORT | :py:obj:`int` |
- +-------------+-------------+--------------------------------------------------------------+
- | SCALAR | DEV_LONG | :py:obj:`int` |
- +-------------+-------------+--------------------------------------------------------------+
- | SCALAR | DEV_ULONG | :py:obj:`int` |
- +-------------+-------------+--------------------------------------------------------------+
- | SCALAR | DEV_LONG64 | :py:obj:`int`/ :py:obj:`long` |
- +-------------+-------------+--------------------------------------------------------------+
- | SCALAR | DEV_ULONG64 | :py:obj:`int`/ :py:obj:`long` |
- +-------------+-------------+--------------------------------------------------------------+
- | SCALAR | DEV_FLOAT | :py:obj:`float` |
- +-------------+-------------+--------------------------------------------------------------+
- | SCALAR | DEV_DOUBLE | :py:obj:`float` |
- +-------------+-------------+--------------------------------------------------------------+
- | SCALAR | DEV_STRING | :py:obj:`str` |
- +-------------+-------------+--------------------------------------------------------------+
- | SPECTRUM | DEV_BOOLEAN | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.bool`) |
- | or IMAGE | | or sequence<:py:obj:`bool`> |
- +-------------+-------------+--------------------------------------------------------------+
- | | DEV_UCHAR | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint8`) |
- | | | or sequence<:py:obj:`int`> |
- +-------------+-------------+--------------------------------------------------------------+
- | | DEV_SHORT | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.int16`) |
- | | | or sequence<:py:obj:`int`> |
- +-------------+-------------+--------------------------------------------------------------+
- | | DEV_USHORT | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint16`) |
- | | | or sequence<:py:obj:`int`> |
- +-------------+-------------+--------------------------------------------------------------+
- | | DEV_LONG | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.int32`) |
- | | | or sequence<:py:obj:`int`> |
- +-------------+-------------+--------------------------------------------------------------+
- | | DEV_ULONG | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint32`) |
- | | | or sequence<:py:obj:`int`> |
- +-------------+-------------+--------------------------------------------------------------+
- | | DEV_LONG64 | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.int64`) |
- | | | or sequence<:py:obj:`int`> |
- +-------------+-------------+--------------------------------------------------------------+
- | | DEV_ULONG64 | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.uint64`) |
- | | | or sequence<:py:obj:`int`> |
- +-------------+-------------+--------------------------------------------------------------+
- | | DEV_FLOAT | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.float32`) |
- | | | or sequence<:py:obj:`float`> |
- +-------------+-------------+--------------------------------------------------------------+
- | | DEV_DOUBLE | :py:class:`numpy.ndarray` (dtype= :py:obj:`numpy.float64`) |
- | | | or sequence<:py:obj:`float`> |
- +-------------+-------------+--------------------------------------------------------------+
- | | DEV_STRING | sequence<:py:obj:`str`> |
- +-------------+-------------+--------------------------------------------------------------+
-
-For SPECTRUM and IMAGES the actual sequence object used depends on the context
-where the tango data is used, and the availability of :py:mod:`numpy`.
-
-1. for properties the sequence is always a :py:class:`list`. Example:
-
- >>> import PyTango
- >>> db = PyTango.Database()
- >>> s = db.get_property(["TangoSynchrotrons"])
- >>> print type(s)
- <type 'list'>
-
-2. for attribute/command values
- - :py:class:`numpy.ndarray` if PyTango was compiled with :py:mod:`numpy`
- support (default) and :py:mod:`numpy` is installed.
- - :py:class:`list` otherwise
-
+
+Please check :ref:`pytango-data-types` chapter to understand the data types
+that can be used in attribute.
+
The following code is an example of how you write code executed when a client
read an attribute which is called *Long_attr*::
@@ -855,7 +613,6 @@ creates a device of some arbitrary class (the example assumes the tango commands
with two strings. No error processing was done on the code for simplicity sake)::
class MyDevice(PyTango.Device_4Impl):
- ...
def CreateDevice(self, pars):
klass_name, dev_name = pars
@@ -882,7 +639,6 @@ For example, if you wish to create a clone of your device, you can create a
tango command called Clone::
class MyDevice(PyTango.Device_4Impl):
- ...
def fill_new_device_properties(self, dev_name):
prop_names = db.get_device_property_list(self.get_name(), "*")
@@ -999,7 +755,7 @@ Server API
.. toctree::
:maxdepth: 2
- api2
+ server
device
device_class
logging
diff --git a/doc/server/server.rst b/doc/server/server.rst
new file mode 100644
index 0000000..2eb660b
--- /dev/null
+++ b/doc/server/server.rst
@@ -0,0 +1,109 @@
+
+.. currentmodule:: PyTango.server
+
+.. _pytango-hlapi:
+
+High Level API
+==============
+
+This module provides a high level device server API. It implements
+:ref:`TEP1 <pytango-TEP1>`. It exposes an easier API for developing a Tango
+device server.
+
+Here is a simple example on how to write a *Clock* device server using the
+high level API::
+
+ import time
+ from PyTango.server import server_run
+ from PyTango.server import Device, DeviceMeta
+ from PyTango.server import attribute, command
+
+ class Clock(Device):
+ __metaclass__ = DeviceMeta
+
+ time = attribute()
+
+ def read_time(self):
+ return time.time()
+
+ @command(din_type=str, dout_type=str)
+ def strftime(self, format):
+ return time.strftime(format)
+
+ if __name__ == "__main__":
+ server_run((Clock,))
+
+Here is a more complete example on how to write a *PowerSupply* device server
+using the high level API. The example contains:
+
+#. a read-only double scalar attribute called *voltage*
+#. a read/write double scalar expert attribute *current*
+#. a read-only double image attribute called *noise*
+#. a *ramp* command
+#. a *host* device property
+#. a *port* class property
+
+.. code-block:: python
+ :linenos:
+
+ from time import time
+
+ from PyTango import AttrQuality, AttrWriteType, DispLevel, server_run
+ from PyTango.server import Device, DeviceMeta, attribute, command
+ from PyTango.server import class_property, device_property
+
+ class PowerSupply(Device):
+ __metaclass__ = DeviceMeta
+
+ voltage = attribute()
+
+ current = attribute(label="Current",
+ dtype=float,
+ display_level=DispLevel.EXPERT,
+ access=AttrWriteType.READ_WRITE,
+ unit="A",
+ format="8.4f",
+ min_value=0.0, max_value=8.5,
+ min_alarm=0.1, max_alarm=8.4,
+ min_warning=0.5, max_warning=8.0,
+ fget="get_current",
+ fset="set_current",
+ doc="the power supply current")
+
+ noise = attribute(label="Noise",
+ dtype=((float,),),
+ max_dim_x=1024, max_dim_y=1024,
+ fget="get_noise")
+
+ host = device_property(dtype=str)
+ port = class_property(dtype=int, default_value=9788)
+
+ def read_voltage(self):
+ self.info_stream("get voltage(%s, %d)" %(self.host, self.port))
+ return 10.0
+
+ def get_current(self):
+ return 2.3456, time(), AttrQuality.ATTR_WARNING
+
+
+*Pretty cool, uh?*
+
+API
+---
+
+.. automodule:: PyTango.server
+
+ .. autoclass:: Device
+ :show-inheritance:
+ :inherited-members:
+ :members:
+
+ .. autoclass:: attribute
+
+ .. autofunction:: command
+
+ .. autoclass:: device_property
+
+ .. autoclass:: class_property
+
+ .. autofunction:: server_run
diff --git a/doc/sphinxext/ipython_console_highlighting.py b/doc/sphinxext/ipython_console_highlighting.py
index 063468c..1a9bf2e 100644
--- a/doc/sphinxext/ipython_console_highlighting.py
+++ b/doc/sphinxext/ipython_console_highlighting.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""reST directive for syntax-highlighting ipython interactive sessions.
@@ -134,4 +122,4 @@ def setup(app):
#-----------------------------------------------------------------------------
# Register the extension as a valid pygments lexer
-highlighting.lexers['ipython'] = IPythonConsoleLexer()
\ No newline at end of file
+highlighting.lexers['ipython'] = IPythonConsoleLexer()
diff --git a/doc/start.rst b/doc/start.rst
index 9feb492..4408937 100644
--- a/doc/start.rst
+++ b/doc/start.rst
@@ -6,106 +6,54 @@
Getting started
===============
-Quick installation
-------------------
+Quick installation: Linux
+-------------------------
-If you have all :ref:`dependencies <dependencies>` installed on your system,
-building and installing / updating PyTango can be as simple as::
+PyTango is available on linux as an official debian/ubuntu package::
- easy_install -U PyTango
+ $ sudo apt-get install python-pytango
-.. _dependencies:
-
-If you managed to run this line, the :ref:`quick tour <quick-tour>` can guide
-you through the first steps on using PyTango.
-
-Dependencies on other libraries
--------------------------------
-
-.. graphviz::
+RPM packages are also available for RHEL & CentOS:
- digraph dependencies {
- size="6,3";
- PyTango [shape=box, label="PyTango 8.0"];
- Python [shape=box, label="Python >=2.6"];
- boostpython [shape=box, label="boost python"];
- Tango [shape=box, label="Tango >=8.0.5"];
- omniORB [shape=box, label="omniORB >=4"];
- numpy [shape=box, label="numpy >=1.1.0"];
- IPython [shape=box, label="IPython >=0.10"];
- PyTango -> Python;
- PyTango -> Tango;
- PyTango -> numpy [style=dotted, label="mandatory in windows"];
- Tango -> omniORB;
- PyTango -> boostpython
- PyTango -> IPython [style=dotted, label="optional"];
- }
+.. hlist::
+ :columns: 2
-Don't be scared by the graph. Probably most of the packages are already installed.
-The current PyTango version has three major dependencies:
+ * `RHEL 5/CentOS 5 32bits <ftp://ftp.maxlab.lu.se/pub/maxlab/packages/el5/i386/repoview/index.html>`_
+ * `RHEL 5/CentOS 5 64bits <ftp://ftp.maxlab.lu.se/pub/maxlab/packages/el5/x86_64/repoview/index.html>`_
+ * `RHEL 6/CentOS 6 32bits <ftp://ftp.maxlab.lu.se/pub/maxlab/packages/el6/i386/repoview/index.html>`_
+ * `RHEL 6/CentOS 6 64bits <ftp://ftp.maxlab.lu.se/pub/maxlab/packages/el6/x86_64/repoview/index.html>`_
-- python (>= 2.6) (http://www.python.org/)
-- Tango (>= 8.0.5) (http://www.tango-controls.org/)
-- boost python (http://www.boost.org):
- We **strongly** recommend always using boost python >= 1.41
-
-plus two optional dependencies (activated by default) on:
+From PyPi
+~~~~~~~~~
-- IPython (>=0.10) (http://www.ipython.org/) (necessary for :ref:`itango`)
-- numpy (>= 1.1.0) (http://numpy.scipy.org/)
+You can also install the latest version from `PyPi`_.
-.. note::
- For the provided windows binary, numpy is MANDATORY!
+First, make sure you have the following packages already installed (all of them
+are available from the major official distribution repositories):
-Installing precompiled binaries
--------------------------------
+* `boost-python`_ (including boost-python-dev)
+* `numpy`_
+* `IPython`_ (optional, highly recommended)
-Linux
-~~~~~
+Then install PyTango either from pip::
-PyTango is available on linux as an official debian/ubuntu package (python-pytango).
+ $ pip install PyTango
-RPM packages are also available for RHEL & CentOS:
+or easy_install::
- * `RHEL5/CentOS5 5 32bits <ftp://ftp.maxlab.lu.se/pub/maxlab/packages/el5/i386/repoview/index.html>`_
- * `RHEL5/CentOS5 5 64bits <ftp://ftp.maxlab.lu.se/pub/maxlab/packages/el5/x86_64/repoview/index.html>`_
- * `RHEL6/CentOS6 5 32bits <ftp://ftp.maxlab.lu.se/pub/maxlab/packages/el6/i386/repoview/index.html>`_
- * `RHEL6/CentOS6 5 64bits <ftp://ftp.maxlab.lu.se/pub/maxlab/packages/el6/x86_64/repoview/index.html>`_
+ $ easy_install -U PyTango
-.. _pytango-windows-bin:
+Quick installation: Windows
+---------------------------
-Windows
-~~~~~~~
+First, make sure `Python`_ and `numpy`_ are installed.
PyTango team provides a limited set of binary PyTango distributables for
-Windows XP/Vista/7. The complete list of binaries can be downloaded from
-`PyTango PyPI website <http://pypi.python.org/pypi/PyTango/>`_.
-
-Steps:
-
-* Install `Tango C++ 32 bits <http://ftp.esrf.fr/pub/cs/tango/TangoSetup-8.0.5_win32.exe>`_
-* For `Python 2.6 32 bits <http://www.python.org/ftp/python/2.6.6/python-2.6.6.msi>`_
- * `Numpy for python 2.6 <http://pypi.python.org/packages/2.6/n/numpy/numpy-1.6.2.win32-py2.6.exe>`_
- * `PyTango 8 for python 2.6 <http://pypi.python.org/packages/2.6/P/PyTango/PyTango-8.0.2.win32-py2.6.msi>`_
-* For `Python 2.7 32 bits <http://www.python.org/ftp/python/2.7.3/python-2.7.3.msi>`_
- * `Numpy for python 2.7 <http://pypi.python.org/packages/2.7/n/numpy/numpy-1.6.2.win32-py2.7.exe>`_
- * `PyTango 8 for python 2.7 <http://pypi.python.org/packages/2.7/P/PyTango/PyTango-8.0.2.win32-py2.7.msi>`_
-* For `Python 3.1 32 bits <http://www.python.org/ftp/python/3.1.4/python-3.1.4.msi>`_
- * `Numpy for python 3.1 <http://pypi.python.org/packages/3.1/n/numpy/numpy-1.6.2.win32-py3.1.exe>`_
- * `PyTango 8 for python 3.1 <http://pypi.python.org/packages/3.1/P/PyTango/PyTango-8.0.2.win32-py3.1.msi>`_
-* For `Python 3.2 32 bits <http://www.python.org/ftp/python/3.2.3/python-3.2.3.msi>`_
- * `Numpy for python 3.2 <http://pypi.python.org/packages/3.2/n/numpy/numpy-1.6.2.win32-py3.2.exe>`_
- * `PyTango 8 for python 3.2 <http://pypi.python.org/packages/3.2/P/PyTango/PyTango-8.0.2.win32-py3.2.msi>`_
-
-..
-.. _PyTango-8.0.2.win32-py2.6.msi: http://pypi.python.org/packages/2.6/P/PyTango/PyTango-8.0.2.win32-py2.6.msi
-.. _PyTango-8.0.2.win32-py2.6.exe: http://pypi.python.org/packages/2.6/P/PyTango/PyTango-8.0.2.win32-py2.6.exe
-.. _PyTango-8.0.2.win32-py2.7.msi: http://pypi.python.org/packages/2.7/P/PyTango/PyTango-8.0.2.win32-py2.7.msi
-.. _PyTango-8.0.2.win32-py2.7.exe: http://pypi.python.org/packages/2.7/P/PyTango/PyTango-8.0.2.win32-py2.7.exe
-.. _PyTango-8.0.2.win32-py3.1.msi: http://pypi.python.org/packages/3.1/P/PyTango/PyTango-8.0.2.win32-py3.1.msi
-.. _PyTango-8.0.2.win32-py3.1.exe: http://pypi.python.org/packages/3.1/P/PyTango/PyTango-8.0.2.win32-py3.1.exe
-.. _PyTango-8.0.2.win32-py3.2.msi: http://pypi.python.org/packages/3.2/P/PyTango/PyTango-8.0.2.win32-py3.2.msi
-.. _PyTango-8.0.2.win32-py3.2.exe: http://pypi.python.org/packages/3.2/P/PyTango/PyTango-8.0.2.win32-py3.2.exe
+Windows XP/Vista/7/8. The complete list of binaries can be downloaded from
+`PyPI`_.
+
+Select the proper windows package, download it and finally execute the
+installion wizard.
Compiling & installing
@@ -120,109 +68,35 @@ distutils.
Besides the binaries for the three dependencies mentioned above, you also need
the development files for the respective libraries.
-boost python dependency
-#######################
-
-PyTango has a dependency on the boost python library (>= 1.33). This means that
-the shared library file **libboost-python.so** must be accessible to the
-compilation command.
-
-.. note::
+You can get the latest ``.tar.gz`` from `PyPI`_ or directly
+the latest SVN checkout::
- If you use python >= 2.6.3 you MUST install boost python >= 1.41
+ $ svn co http://svn.code.sf.net/p/tango-cs/code/bindings/PyTango/trunk PyTango
+ $ cd PyTango
+ $ python setup.py build
+ $ sudo python setup.py install
-Most linux distributions today provide a boost python package.
-
-Furthermore, in order to be able to build PyTango, you also need the include
-headers of boost python. They are normaly provided by a package called
-boost_python-dev.
-
-If, for some reason, you need to compile and install boost python, here is a
-quick recipie:
-
- #. Download latest boost tar.gz file and extract it
- #. Download latest bjam (most linux distributions have a bjam package. If
- not, sourceforge provides a binary for many platforms)
- #. build and/or install:
-
- #. Simple build: in the root directory where you extracted boost type:
-
- ``bjam --with-python toolset=gcc variant=release threading=multi link=shared``
-
- this will produce in :file:`bin.v2/libs/python/build/gcc-<gcc_ver>/release/threading-multi` a file called :file:`libboost_python-gcc<gcc_ver>-mt-<boost_ver>.so.<boost_python_ver>`
-
- #. Install (you may need administrator permissions to do so):
-
- ``bjam --with-python toolset=gcc variant=release threading=multi link=shared install``
-
- #. Install in a different directory (<install_dir>):
-
- ``bjam --with-python toolset=gcc variant=release threading=multi link=shared install --prefix=<install_dir>``
-
-
-boost, omniORB and TangoC++ configuration
-#########################################
-
-The second step is to make sure the three/four libraries (omniORB, tango,
-boost python and/or numpy) are accessible to the compilation command. So, for
-example, if you installed:
-
- ``boost python under /home/homer/local``
-
- ``omniORB under /home/homer/local1``
-
- ``tango under /home/homer/local2``
-
- ``numpy under /usr/lib/python2.6/site-packages/numpy``
-
-you must export the three environment variables::
-
- export BOOST_ROOT=/home/homer/local
- export OMNI_ROOT=/home/homer/local1
- export TANGO_ROOT=/home/homer/local2
-
- # in openSUSE 11.1 this is the default base location for the include files
- export NUMPY_ROOT=/usr/lib/python2.6/site-packages/numpy/core
-
-(for numpy this is the default base location for the include files. This is
-distribution dependent. For example, ubuntu places a numpy directory under /usr/include,
-so exporting NUMPY_ROOT is not necessary for this distribution)
-
-For the libraries that were installed in the default system directory (/usr or /usr/local)
-the above lines are not necessary.
-
-.. _build-install:
-
-build & install
-###############
-
-Finally::
-
- python setup.py build
- sudo python setup.py install
-
This will install PyTango in the system python installation directory and, since
version 8.0.0, it will also install :ref:`itango` as an IPython_ extension.
-
-Or if you whish to install in a different directory::
-
- python setup.py build
- python setup.py install --prefix=/home/homer/local --ipython-local
-(This will try to install :ref:`itango` as an IPython profile to the local
-user, since probably there is no permission to write into the IPython_ extension
-directory)
+If whish to install in a different directory, replace the last line with::
+
+ $ # private installation to your user (usually ~/.local/lib/python<X>.<Y>/site-packages
+ $ python setup.py install --user
-Or if you wish to use your own private python distribution::
+ $ # or specific installation directory
+ $ python setup.py install --prefix=/home/homer/local
- /home/homer/bin/python setup.py build
- /home/homer/bin/python setup.py install
+Windows
+~~~~~~~
-For the last case above don't forget that boost python should have also been
-previously compiled with this private python distribution.
+On windows, PyTango must be built using MS VC++.
+Since it is rarely needed and the instructions are so complicated, I have
+choosen to place the how-to in a separate text file. You can find it in the
+source package under :file:`doc/windows_notes.txt`.
-test
-####
+Testing your installation
+-------------------------
If you have IPython_ installed, the best way to test your PyTango installation
is by starting the new PyTango CLI called :ref:`itango` by typing on the command
@@ -237,167 +111,13 @@ then, in ITango type:
ITango [1]: PyTango.Release.version
Result [1]: '8.0.2'
-(if you are wondering, :ref:`itango` automaticaly does ``import PyTango`` for you!)
+(if you are wondering, :ref:`itango` automaticaly does ``import PyTango``
+for you!)
-If you don't have IPython_ installed, to test the installation start a python console
-and type:
+If you don't have IPython_ installed, to test the installation start a
+python console and type:
>>> import PyTango
>>> PyTango.Release.version
'8.0.2'
-Windows
-~~~~~~~
-
-On windows, PyTango must be built using MS VC++.
-
-... which is good fun specially if you only have express edition and multiple python versions to build with!
-
-Pre-requisites
-##############
-
-**Python**
-
-Python must be installed in the following directory structure:
-
- <PythonBaseDir>\\<PlatformName>\\<PythonVersion>
-
-Where:
-
- - <PythonBaseDir> is a directory that can be choosen by the you (ex: C:\\Python)
- - <PlatformName> **must** be either *win32* or *x64*
- - <PythonVersion> **must** be *26*, *27*, *31*, *32*, *33*
-
-Example: Assuming you choose *C:\\Python* as PythonBaseDir, if you want to build
-PyTango for python 2.7 on 64 bits you must install python in:
-
- c:\\python\\x64\\27
-
-**Visual C++**
-
-Python recommends compiling any python libraries using the same compiler
-version. So, depending on the python version(s) you want PyTango to be
-build, you need VC++ 9.0 (2008) or/and VC++ 10.0 (2010).
-
-Here is the table of compilers and corresponding Visual C++ version used by CPython:
-
-+----------------------+--------------+
-| Visual C++ version | Compiler |
-+======================+==============+
-| Visual C++ 4.x | MSC_VER=1000 |
-+----------------------+--------------+
-| Visual C++ 5 | MSC_VER=1100 |
-+----------------------+--------------+
-| Visual C++ 6 | MSC_VER=1200 |
-+----------------------+--------------+
-| Visual C++ .NET | MSC_VER=1300 |
-+----------------------+--------------+
-| Visual C++ .NET 2003 | MSC_VER=1310 |
-+----------------------+--------------+
-| Visual C++ 2005 | MSC_VER=1400 |
-+----------------------+--------------+
-| Visual C++ 2008 | MSC_VER=1500 |
-+----------------------+--------------+
-| Visual C++ 2010 | MSC_VER=1600 |
-+----------------------+--------------+
-| Visual C++ 2011 | MSC_VER=1700 |
-+----------------------+--------------+
-
-+----------+--------------+-----------------------------+
-| version | architecture | VC++ |
-+==========+==============+=============================+
-| 2.6.6 | 32 bits | MSC 1500 (Visual C++ 2008) |
-+----------+--------------+-----------------------------+
-| 2.6.6 | 64 bits | MSC 1500 (Visual C++ 2008) |
-+----------+--------------+-----------------------------+
-| 2.7.3 | 32 bits | MSC 1500 (Visual C++ 2008) |
-+----------+--------------+-----------------------------+
-| 2.7.3 | 64 bits | MSC 1500 (Visual C++ 2008) |
-+----------+--------------+-----------------------------+
-| 3.1.4 | 32 bits | MSC 1500 (Visual C++ 2008) |
-+----------+--------------+-----------------------------+
-| 3.1.4 | 64 bits | MSC 1500 (Visual C++ 2008) |
-+----------+--------------+-----------------------------+
-| 3.2.3 | 32 bits | MSC 1500 (Visual C++ 2008) |
-+----------+--------------+-----------------------------+
-| 3.2.3 | 64 bits | MSC 1500 (Visual C++ 2008) |
-+----------+--------------+-----------------------------+
-| 3.3.0 | 32 bits | MSC 1600 (Visual C++ 2010) |
-+----------+--------------+-----------------------------+
-| 3.3.0 | 64 bits | MSC 1600 (Visual C++ 2010) |
-+----------+--------------+-----------------------------+
-
-**Visual C++ 9.0 (2008) express quick install guide**
-
-1. Download and install VC++ 9.0 (2008) Express Edition
-2. If you need to compile in 64 bits platform
- 2.1. Download and install Windows 7 SDK for .NET Framework 3.5 SP1 [a.k.a. Windows SDK 7.0]
- (**not** Windows SDK 7.1!)
-
- 2.2. The vcvarsall.bat in VC++ 2008 Express looks for the x86_amd64 vcvarsx86_amd64.bat
- in all the wrong places. The easiest way to work around that is to navigate to the
- VC\\bin directory of your VC++ 2008 installation (in my case
- C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\bin). Copy vcvarsx86_amd64.bat,
- and paste into the VC\\bin\\x86_amd64 subdirectory.
-
-**Visual C++ 10.0 (2010) express quick install guide**
-
-1. Download and install VC++ 10.0 (2010) Express Edition
-2. If you need to compile in 64 bits platform follow the instructions
- **in the order they appear** (not doing so may lead to
- `KB2519277 <http://support.microsoft.com/kb/2519277>`_ problem)
-
- 2.1. Visual Studio 2010 SP1
-
- 2.2. Download and install Windows 7 SDK for .NET Framework 4.0 [a.k.a. Windows SDK 7.1]
-
- 2.3. VC++ 2010 doesn't come with vcvarsx86_amd64.bat. But in this case, since the
- environment setting tool is different than in VC++ 2008, all you have to do is
- create a file called vcvarsx86_amd64.bat in VC\\bin\\x86_amd64 directory of your
- VC++ 2010 installation (in my case
- C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\bin\\x86_amd64) with the
- following content:
-
- @CALL "C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bin\\SetEnv.Cmd" /Release /x64
-
- (adapt to your Windows SDK installation directory)
-
-**Boost python**
-
-Boost python DLL, lib and header files must be installed for the specific platform(s)
-and python version(s) you which to build PyTango on. The directory structure for
-the boost headers:
-
- <BoostDir>\\include
-
-The directory structure for the boost libraries:
-
- <BoostDir>\\multi\\release\\<MSVCVersion>\\<PlatformName>\\<Link>\\<RuntimeLink>\\<PythonVersion>
-
-Where:
-
- - <BoostDir> the boost base directory (ex: C:\Boost-1.53.0)
- - <MSVCVersion> may be either *msvc-9.0* or *msvc-10.0*
- - <PlatformName> **must** be either *win32* or *x64*
- - <Link> **must** be either *static* or *shared*
- - <RuntimeLink> **must** be either *static* or *shared*
- (if Link==static, RuntimeLink can only be *static*)
- - <PythonVersion> **must** be *26*, *27*, *31*, *32*, *33*
-
-**Boost python multi platform compilation quick build guide**
-
- - Download boost source code from http://wwww.boost.org
- - Extract boost to a directory (ex: c:\\workspace\\boost-1.53.0)
- - Download and place `boost_python_install.py <>` in your boost extract directory (ex: c:\\workspace\\boost-1.53.0\\boost_python_install.py)
- (adapt python versions you which to build)
- - Place the user-config.jam file in %HOMEPATH%%HOMEDIR% (adapt paths and python versions to your system)
- - Open a console
- - Switch to the boost directory
- - Execute this script using python (ex: C:\\Python\\win32\\26\\python.exe boost_python_install.py)
-
-**Tango**
-
-
-
-.. _IPython: http://ipython.scipy.org/
-
diff --git a/doc/tep/tep-0001.rst b/doc/tep/tep-0001.rst
index c84923f..27ef5cf 100644
--- a/doc/tep/tep-0001.rst
+++ b/doc/tep/tep-0001.rst
@@ -1,18 +1,18 @@
-.. currentmodule:: PyTango.api2
+.. currentmodule:: PyTango.hlapi
.. _pytango-TEP1:
-=================================
-TEP 1 - Device Server API Level 2
-=================================
+====================================
+TEP 1 - Device Server High Level API
+====================================
================== ====================================================
TEP: 1
================== ====================================================
- Title: Device Server API Level 2
- Version: 2.0.0
- Last-Modified: 22-Oct-2012
+ Title: Device Server High Level API
+ Version: 2.1.0
+ Last-Modified: 13-Nov-2013
Author: Tiago Coutinho <tcoutinho at cells.es>
Status: Active
Type: Standards Track
@@ -125,10 +125,10 @@ In order to keep the code up to date with tango, every time a new Tango IDL
is released, the code of **every** device server needs to be manually
updated to ihnerit from the newest tango version.
-By inheriting from a new high-level :class:`~PyTango.api2.Device` (which
+By inheriting from a new high-level :class:`~PyTango.hlapi.Device` (which
itself automatically *decides* from which DeviceImpl version it should
inherit), the device servers are always up to date with the latest tango
-release without need for manual intervention (see :mod:`PyTango.api2`).
+release without need for manual intervention (see :mod:`PyTango.hlapi`).
Low-level way::
@@ -137,17 +137,17 @@ Low-level way::
High-level way::
- class Motor(PyTango.api2.Device):
+ class Motor(PyTango.hlapi.Device):
pass
-Default implementation of :class:`~PyTango.api2.Device` constructor
+Default implementation of :class:`~PyTango.hlapi.Device` constructor
--------------------------------------------------------------------------------
99% of the different device classes which inherit from low level
:class:`~PyTango.DeviceImpl` only implement `__init__` to call their
-`init_device` (see :mod:`PyTango.api2`).
+`init_device` (see :mod:`PyTango.hlapi`).
-:class:`~PyTango.api2.Device` already calls init_device.
+:class:`~PyTango.hlapi.Device` already calls init_device.
Low-level way::
@@ -159,21 +159,21 @@ Low-level way::
High-level way::
- class Motor(PyTango.api2.Device):
+ class Motor(PyTango.hlapi.Device):
# Nothing to be done!
pass
-Default implementation of :meth:`~PyTango.api2.Device.init_device`
+Default implementation of :meth:`~PyTango.hlapi.Device.init_device`
--------------------------------------------------------------------------------
99% of different device classes which inherit from low level
:class:`~PyTango.DeviceImpl` have an implementation of `init_device` which
*at least* calls :meth:`~PyTango.DeviceImpl.get_device_properties`
-(see :mod:`PyTango.api2`).
+(see :mod:`PyTango.hlapi`).
-:meth:`~PyTango.api2.Device.init_device` already calls :meth:`~PyTango.api2.Device.get_device_properties`.
+:meth:`~PyTango.hlapi.Device.init_device` already calls :meth:`~PyTango.hlapi.Device.get_device_properties`.
Low-level way::
@@ -184,7 +184,7 @@ Low-level way::
High-level way::
- class Motor(PyTango.api2.Device):
+ class Motor(PyTango.hlapi.Device):
# Nothing to be done!
pass
@@ -199,8 +199,8 @@ device and class properties by using the corresponding
With the high-level API we completely remove the need to code the
:class:`~PyTango.DeviceClass` by registering attribute, commands,
-device and class properties in the :class:`~PyTango.api2.Device` with a more
-pythonic API (see :mod:`PyTango.api2`)
+device and class properties in the :class:`~PyTango.hlapi.Device` with a more
+pythonic API (see :mod:`PyTango.hlapi`)
#. Hide `<Device>Class` class completely
@@ -232,9 +232,9 @@ Low-level way::
High-level way::
- class Motor(PyTango.api2.Device):
+ class Motor(PyTango.hlapi.Device):
- position = PyTango.api2.attribute(dtype=float, )
+ position = PyTango.hlapi.attribute(dtype=float, )
def read_position(self):
pass
@@ -569,12 +569,12 @@ instead::
if __name__ == '__main__':
main()
-And the equivalent API2 version of the code would be::
+And the equivalent HLAPI version of the code would be::
#!/usr/bin/env python
from PyTango import DebugIt, server_run
- from PyTango.api2 import Device, DeviceMeta, attribute
+ from PyTango.hlapi import Device, DeviceMeta, attribute
class Motor(Device):
@@ -595,11 +595,16 @@ And the equivalent API2 version of the code would be::
References
==========
-:mod:`PyTango.api2`
+:mod:`PyTango.hlapi`
Changes
=======
+from 2.0.0 to 2.1.0
+-------------------
+
+Changed module name from *api2* to *hlapi* (High Level API)
+
From 1.0.0 to 2.0.0
-------------------
diff --git a/doc/utilities.rst b/doc/utilities.rst
index 962e8dd..26152c9 100644
--- a/doc/utilities.rst
+++ b/doc/utilities.rst
@@ -3,9 +3,6 @@
The Utilities API
=================
-.. autofunction:: PyTango.server_run
-
-
.. currentmodule:: PyTango.utils
.. autoclass:: PyTango.utils.EventCallBack
diff --git a/doc/windows_notes.txt b/doc/windows_notes.txt
new file mode 100644
index 0000000..8df6a95
--- /dev/null
+++ b/doc/windows_notes.txt
@@ -0,0 +1,156 @@
+Windows
+~~~~~~~
+
+On windows, PyTango must be built using MS VC++.
+
+... which is good fun specially if you only have express edition and multiple python versions to build with!
+
+.. warning::
+ The next chapters are internal notes I have gathered along the years to
+ overcome windows limitations/problems in order to be able to compile PyTango.
+ They are not for the weak of heart, seriously!
+
+Pre-requisites
+##############
+
+**Python**
+
+Python must be installed in the following directory structure:
+
+ <PythonBaseDir>\\<PlatformName>\\<PythonVersion>
+
+Where:
+
+ - <PythonBaseDir> is a python base directory choosen by you (ex: :file:`C:\\Python`)
+ - <PlatformName> **must** be either *win32* or *x64*
+ - <PythonVersion> **must** be *26*, *27*, *31*, *32*, *33*
+
+Example: Assuming you choose *C:\\Python* as PythonBaseDir, if you want to build
+PyTango for python 2.7 on 64 bits you must install python in
+:file:`C:\\python\\x64\\27`.
+
+**Visual C++**
+
+Python recommends compiling any python libraries using the same compiler
+version. So, depending on the python version(s) you want PyTango to be
+build, you need VC++ 9.0 (2008) or/and VC++ 10.0 (2010).
+
+Here is the table of compilers and corresponding Visual C++ version used by CPython:
+
++----------------------+--------------+
+| Visual C++ version | Compiler |
++======================+==============+
+| Visual C++ 4.x | MSC_VER=1000 |
++----------------------+--------------+
+| Visual C++ 5 | MSC_VER=1100 |
++----------------------+--------------+
+| Visual C++ 6 | MSC_VER=1200 |
++----------------------+--------------+
+| Visual C++ .NET | MSC_VER=1300 |
++----------------------+--------------+
+| Visual C++ .NET 2003 | MSC_VER=1310 |
++----------------------+--------------+
+| Visual C++ 2005 | MSC_VER=1400 |
++----------------------+--------------+
+| Visual C++ 2008 | MSC_VER=1500 |
++----------------------+--------------+
+| Visual C++ 2010 | MSC_VER=1600 |
++----------------------+--------------+
+| Visual C++ 2011 | MSC_VER=1700 |
++----------------------+--------------+
+
++----------+--------------+-----------------------------+
+| version | architecture | VC++ |
++==========+==============+=============================+
+| 2.6.6 | 32 bits | MSC 1500 (Visual C++ 2008) |
++----------+--------------+-----------------------------+
+| 2.6.6 | 64 bits | MSC 1500 (Visual C++ 2008) |
++----------+--------------+-----------------------------+
+| 2.7.3 | 32 bits | MSC 1500 (Visual C++ 2008) |
++----------+--------------+-----------------------------+
+| 2.7.3 | 64 bits | MSC 1500 (Visual C++ 2008) |
++----------+--------------+-----------------------------+
+| 3.1.4 | 32 bits | MSC 1500 (Visual C++ 2008) |
++----------+--------------+-----------------------------+
+| 3.1.4 | 64 bits | MSC 1500 (Visual C++ 2008) |
++----------+--------------+-----------------------------+
+| 3.2.3 | 32 bits | MSC 1500 (Visual C++ 2008) |
++----------+--------------+-----------------------------+
+| 3.2.3 | 64 bits | MSC 1500 (Visual C++ 2008) |
++----------+--------------+-----------------------------+
+| 3.3.0 | 32 bits | MSC 1600 (Visual C++ 2010) |
++----------+--------------+-----------------------------+
+| 3.3.0 | 64 bits | MSC 1600 (Visual C++ 2010) |
++----------+--------------+-----------------------------+
+
+**Visual C++ 9.0 (2008) express quick install guide**
+
+1. Download and install VC++ 9.0 (2008) Express Edition
+2. If you need to compile in 64 bits platform
+ 2.1. Download and install Windows 7 SDK for .NET Framework 3.5 SP1 [a.k.a. Windows SDK 7.0]
+ (**not** Windows SDK 7.1!)
+
+ 2.2. The vcvarsall.bat in VC++ 2008 Express looks for the x86_amd64 :file:`vcvarsx86_amd64.bat`
+ in all the wrong places. The easiest way to work around that is to navigate to the
+ :file:`VC\\bin` directory of your VC++ 2008 installation (in my case
+ :file:`C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\bin`). Copy :file:`vcvarsx86_amd64.bat`,
+ and paste into the :file:`VC\\bin\\x86_amd64 subdirectory`.
+
+**Visual C++ 10.0 (2010) express quick install guide**
+
+1. Download and install VC++ 10.0 (2010) Express Edition
+2. If you need to compile in 64 bits platform follow the instructions
+ **in the order they appear** (not doing so may lead to
+ `KB2519277 <http://support.microsoft.com/kb/2519277>`_ problem)
+
+ 2.1. Visual Studio 2010 SP1
+
+ 2.2. Download and install Windows 7 SDK for .NET Framework 4.0 [a.k.a. Windows SDK 7.1]
+
+ 2.3. VC++ 2010 doesn't come with vcvarsx86_amd64.bat. But in this case, since the
+ environment setting tool is different than in VC++ 2008, all you have to do is
+ create a file called vcvarsx86_amd64.bat in VC\\bin\\x86_amd64 directory of your
+ VC++ 2010 installation (in my case
+ C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\bin\\x86_amd64) with the
+ following content:
+
+ @CALL "C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bin\\SetEnv.Cmd" /Release /x64
+
+ (adapt to your Windows SDK installation directory)
+
+**Boost python**
+
+Boost python DLL, lib and header files must be installed for the specific platform(s)
+and python version(s) you which to build PyTango on. The directory structure for
+the boost headers:
+
+ <BoostDir>\\include
+
+The directory structure for the boost libraries:
+
+ <BoostDir>\\multi\\release\\<MSVCVersion>\\<PlatformName>\\<Link>\\<RuntimeLink>\\<PythonVersion>
+
+Where:
+
+ - <BoostDir> the boost base directory (ex: C:\Boost-1.53.0)
+ - <MSVCVersion> may be either *msvc-9.0* or *msvc-10.0*
+ - <PlatformName> **must** be either *win32* or *x64*
+ - <Link> **must** be either *static* or *shared*
+ - <RuntimeLink> **must** be either *static* or *shared*
+ (if Link==static, RuntimeLink can only be *static*)
+ - <PythonVersion> **must** be *26*, *27*, *31*, *32*, *33*
+
+**Boost python multi platform compilation quick build guide**
+
+ - Download boost source code from http://wwww.boost.org
+ - Extract boost to a directory (ex: c:\\workspace\\boost-1.53.0)
+ - Download and place `boost_python_install.py <>` in your boost extract directory (ex: c:\\workspace\\boost-1.53.0\\boost_python_install.py)
+ (adapt python versions you which to build)
+ - Place the user-config.jam file in %HOMEPATH%%HOMEDIR% (adapt paths and python versions to your system)
+ - Open a console
+ - Switch to the boost directory
+ - Execute this script using python (ex: C:\\Python\\win32\\26\\python.exe boost_python_install.py)
+
+**Tango**
+
+TODO
diff --git a/scripts/itango b/scripts/itango
index 1547a76..0692811 100755
--- a/scripts/itango
+++ b/scripts/itango
@@ -1,27 +1,15 @@
#!/usr/bin/env python
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""The itango startup file. This executable is actually an extension of the
ipython file that can be found in <prefix>/ipython (prefix usually being in
diff --git a/scripts/winpostinstall.py b/scripts/winpostinstall.py
deleted file mode 100644
index 4c698e7..0000000
--- a/scripts/winpostinstall.py
+++ /dev/null
@@ -1,75 +0,0 @@
-from __future__ import print_function
-
-import sys
-import os
-import os.path
-
-import urllib
-try:
- urlretrieve = urllib.urlretrieve
-except AttributeError:
- import urllib.request
- urlretrieve = urllib.urlrequest.urlretrieve
-
-try:
- file_created
-except:
- def file_created(*args, **kwargs): pass
-
-def find_tango_root():
- program_files = os.environ["PROGRAMFILES"]
- tango = os.path.join(program_files, 'tango')
- if os.path.isdir(tango):
- return tango
-
-def find_tango_dll():
- program_files = os.environ["PROGRAMFILES"]
- tangodll = os.path.join(program_files, 'tango','win32','lib','vc9_dll')
- if os.path.isdir(tangodll):
- return tangodll
-
-def install_tango_dll():
- pytango_web = "http://www.tango-controls.org/static/PyTango/"
- print("Fetching appropriate tango from " + pytango_web+ "...")
- pytango_dll_path = pytango_web + "tangodll/"
- pytango_dll_file = pytango_dll_path + "tango_8.0_win32_vc9_dll.zip"
- filename, headers = urlretrieve(pytango_dll_file)
- import distutils.sysconfig
- import zipfile
- pytango_dll_zip = zipfile.ZipFile(filename)
- pytango_dir = distutils.sysconfig.get_python_lib()
- pytango_dir = os.path.join(pytango_dir, "PyTango")
- print("Extracting " + filename + " into " + pytango_dir + "...")
- pytango_dll_zip.extractall(pytango_dir)
- print("Registering all files...")
- for name in pytango_dll_zip.namelist():
- print("Registering " + name)
- name = os.path.join(pytango_dir, name)
- file_created(name)
-
-def remove():
- print ("removing PyTango")
-
-def install():
- print ("installing PyTango")
-
-def main():
- if len(sys.argv) < 2:
- op = "-install"
- else:
- op = sys.argv[1]
-
- if "-install" in op:
- install()
- elif "-remove" in op:
- remove()
- else:
- print("unknown operation " + op)
-
-if __name__ == "__main__":
- try:
- main()
- except:
- import traceback
- traceback.print_exc()
- raw_input("Press any key to continue")
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 27b7809..e807da5 100644
--- a/setup.py
+++ b/setup.py
@@ -1,32 +1,20 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
import os
-import sys
-import platform
import imp
-import io
+import sys
import struct
+import platform
+import subprocess
from distutils.core import setup, Extension
from distutils.cmd import Command
@@ -35,14 +23,13 @@ from distutils.command.build_ext import build_ext as dftbuild_ext
from distutils.command.install import install as dftinstall
from distutils.unixccompiler import UnixCCompiler
from distutils.version import StrictVersion as V
-import distutils.sysconfig
try:
import sphinx
import sphinx.util.console
sphinx.util.console.color_terminal = lambda : False
from sphinx.setup_command import BuildDoc
-except:
+except ImportError:
sphinx = None
try:
@@ -64,12 +51,30 @@ except:
numpy = None
+is64 = 8 * struct.calcsize("P") == 64
+
+
+def pkg_config(*packages, **config):
+ config_map = {"-I": "include_dirs",
+ "-L": "library_dirs",
+ "-l": "libraries"}
+ cmd = ["pkg-config", "--libs", "--cflags-only-I", " ".join(packages)]
+ result = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
+ for elem in result.split():
+ flag, value = elem[:2], elem[2:]
+ config_values = config.setdefault(config_map.get(flag), [])
+ if value not in config_values:
+ config_values.append(value)
+ return config
+
+
def abspath(*path):
"""A method to determine absolute path for a given relative path to the
directory where this setup.py script is located"""
setup_dir = os.path.dirname(os.path.abspath(__file__))
return os.path.join(setup_dir, *path)
+
def get_release_info():
name = "release"
release_dir = abspath('src', 'boost', 'python')
@@ -77,36 +82,44 @@ def get_release_info():
release = imp.load_module(name, *data)
return release.Release
+
def uniquify(seq):
no_dups = []
- [ no_dups.append(i) for i in seq if not no_dups.count(i) ]
+ for elem in seq:
+ if elem not in no_dups:
+ no_dups.append(elem)
return no_dups
+
def get_c_numpy():
- NUMPY_ROOT = os.environ.get('NUMPY_ROOT')
- if NUMPY_ROOT is not None:
- d = os.path.join(NUMPY_ROOT, 'include')
- if os.path.isdir(d):
- return d
if numpy is None:
- return None
- d = os.path.join(numpy.__path__[0], 'core', 'include')
- if os.path.isdir(d):
- return d
+ return
+ else:
+ get_include = getattr(numpy, "get_include", None)
+ if get_include is None:
+ get_include = getattr(numpy, "get_numpy_include", None)
+ if get_include is None:
+ return
+ inc = get_include()
+ if os.path.isdir(inc):
+ return inc
+
def has_c_numpy():
return get_c_numpy() is not None
+
def has_numpy(with_src=True):
ret = numpy is not None
if with_src:
ret &= has_c_numpy()
return ret
+
def get_script_files():
-
- FILTER_OUT = (), # "winpostinstall.py",
-
+
+ FILTER_OUT = (), # "winpostinstall.py",
+
scripts_dir = abspath('scripts')
scripts = []
items = os.listdir(scripts_dir)
@@ -128,15 +141,43 @@ def get_script_files():
scripts.append('scripts/' + item)
return scripts
+
+def add_lib(name, dirs, sys_libs, env_name=None, lib_name=None, inc_suffix=None):
+ if env_name is None:
+ env_name = name.upper() + '_ROOT'
+ ENV = os.environ.get(env_name)
+ if lib_name is None:
+ lib_name = name
+ if ENV is None:
+ sys_libs.append(lib_name)
+ return
+ else:
+ inc_dir = os.path.join(ENV, 'include')
+ if inc_suffix is not None:
+ inc_dir = os.path.join(inc_dir, inc_suffix)
+ if is64:
+ lib_dir = os.path.join(ENV, 'lib64')
+ if not os.path.isdir(lib_dir):
+ lib_dir = os.path.join(ENV, 'lib')
+ else:
+ lib_dir = os.path.join(ENV, 'lib')
+
+ if lib_name.startswith('lib'):
+ lib_name = lib_name[3:]
+ dirs['include_dirs'].append(inc_dir)
+ dirs['library_dirs'].append(lib_dir)
+ dirs['libraries'].append(lib_name)
+
+
class build(dftbuild):
-
+
user_options = dftbuild.user_options + \
[('without-ipython', None, "Tango IPython extension"),
('strip-lib', None, "strips the shared library of debugging symbols (Unix like systems only)"),
('no-doc', None, "do not build documentation") ]
-
+
boolean_options = dftbuild.boolean_options + ['without-ipython', 'strip-lib', 'no-doc']
-
+
def initialize_options (self):
dftbuild.initialize_options(self)
self.without_ipython = None
@@ -145,21 +186,21 @@ class build(dftbuild):
def finalize_options(self):
dftbuild.finalize_options(self)
-
+
def run(self):
if numpy is None:
self.warn('NOT using numpy: it is not available')
elif get_c_numpy() is None:
self.warn("NOT using numpy: numpy available but C source is not")
-
+
if IPython and not self.without_ipython:
if V(IPython.__version__) > V('0.10'):
self.distribution.py_modules.append('IPython.config.profile.tango.ipython_config')
else:
self.distribution.py_modules.append('IPython.Extensions.ipy_profile_tango')
-
+
dftbuild.run(self)
-
+
if self.strip_lib:
if os.name == 'posix':
has_objcopy = os.system("type objcopy") == 0
@@ -186,15 +227,15 @@ class build(dftbuild):
return False
if V(sphinx.__version__) <= V("0.6.5"):
print("Documentation will not be generated: sphinx version (%s) too low. Needs 0.6.6" % sphinx.__version__)
- return False
+ return False
setup_dir = os.path.dirname(os.path.abspath(__file__))
return os.path.isdir(os.path.join(setup_dir, 'doc'))
- sub_commands = dftbuild.sub_commands + [('build_doc', has_doc),]
+ sub_commands = dftbuild.sub_commands + [('build_doc', has_doc), ]
-class build_ext(dftbuild_ext):
-
+class build_ext(dftbuild_ext):
+
def build_extensions(self):
self.use_cpp_0x = False
if isinstance(self.compiler, UnixCCompiler):
@@ -202,11 +243,12 @@ class build_ext(dftbuild_ext):
while '-Wstrict-prototypes' in compiler_pars:
del compiler_pars[compiler_pars.index('-Wstrict-prototypes')]
#self.compiler.compiler_so = " ".join(compiler_pars)
-
+
# mimic tango check to activate C++0x extension
- import subprocess
compiler = self.compiler.compiler
- pipe = subprocess.Popen(compiler + ["-dumpversion"], stdout=subprocess.PIPE).stdout
+ proc = subprocess.Popen(compiler + ["-dumpversion"], stdout=subprocess.PIPE)
+ pipe = proc.stdout
+ proc.wait()
gcc_ver = pipe.readlines()[0].decode().strip()
if V(gcc_ver) >= V("4.3.3"):
self.use_cpp_0x = True
@@ -220,14 +262,14 @@ class build_ext(dftbuild_ext):
if sphinx:
class build_doc(BuildDoc):
-
+
def run(self):
# make sure the python path is pointing to the newly built
# code so that the documentation is built on this and not a
# previously installed version
-
- build = self.get_finalized_command('build')
- sys.path.insert(0, os.path.abspath(build.build_lib))
+
+ build_cmd = self.get_finalized_command('build')
+ sys.path.insert(0, os.path.abspath(build_cmd.build_lib))
sphinx.setup_command.BuildDoc.run(self)
sys.path.pop(0)
@@ -236,24 +278,24 @@ class install_html(Command):
user_options = [
('install-dir=', 'd', 'base directory for installing HTML documentation files')]
-
+
def initialize_options(self):
self.install_dir = None
-
+
def finalize_options(self):
self.set_undefined_options('install',
('install_html', 'install_dir'))
-
+
def run(self):
- build_doc = self.get_finalized_command('build_doc')
- src_html_dir = abspath(build_doc.build_dir, 'html')
+ build_doc_cmd = self.get_finalized_command('build_doc')
+ src_html_dir = abspath(build_doc_cmd.build_dir, 'html')
self.copy_tree(src_html_dir, self.install_dir)
class install(dftinstall):
-
+
user_options = dftinstall.user_options + \
- [('install-html=', None, "installation directory for HTML documentation"),]
+ [('install-html=', None, "installation directory for HTML documentation"), ]
def initialize_options(self):
dftinstall.initialize_options(self)
@@ -264,31 +306,76 @@ class install(dftinstall):
# We do a hack here. We cannot trust the 'install_base' value because it
# is not always the final target. For example, in unix, the install_base
# is '/usr' and all other install_* are directly relative to it. However,
- # in unix-local (like ubuntu) install_base is still '/usr' but, for
+ # in unix-local (like ubuntu) install_base is still '/usr' but, for
# example, install_data, is '$install_base/local' which breaks everything.
#
# The hack consists in using install_data instead of install_base since
# install_data seems to be, in practice, the proper install_base on all
# different systems.
if self.install_html is None:
- self.install_html = os.path.join(self.install_data, 'share', 'doc', 'PyTango', 'html')
-
+ self.install_html = os.path.join(self.install_data,
+ 'share', 'doc', 'PyTango', 'html')
+
def has_html(self):
return sphinx is not None
-
+
sub_commands = list(dftinstall.sub_commands)
sub_commands.append(('install_html', has_html))
-
+
def main():
- ZMQ_ROOT = LOG4TANGO_ROOT = BOOST_ROOT = OMNI_ROOT = TANGO_ROOT = '/usr'
+ macros = []
+
+ directories = dict(include_dirs=[abspath('src', 'boost', 'cpp')],
+ library_dirs=[],
+ libraries=[])
+ sys_libs = []
+
+ add_lib('omni', directories, sys_libs, lib_name='omniORB4')
+ add_lib('zmq', directories, sys_libs, lib_name='libzmq')
+ add_lib('tango', directories, sys_libs, inc_suffix='tango')
+ add_lib('log4tango', directories, sys_libs)
+
+ # special boost-python configuration
+
+ BOOST_ROOT = os.environ.get('BOOST_ROOT')
+ boost_library_name = 'boost_python'
+ if BOOST_ROOT is None:
+ if 'linux' in sys.platform:
+ dist_name = platform.linux_distribution()[0].lower()
+ debian_based = 'debian' in dist_name or 'ubuntu' in dist_name
+ if debian_based:
+ # when building with multiple version of python on debian we need
+ # to link against boost_python-py25/-py26 etc...
+ pyver = "-py"
+ pyver += "".join(map(str, platform.python_version_tuple()[:2]))
+ boost_library_name += pyver
+ else:
+ inc_dir = os.path.join(BOOST_ROOT, 'include')
+ lib_dir = os.path.join(BOOST_ROOT, 'lib')
+ if is64:
+ lib_dir = os.path.join(BOOST_ROOT, 'lib64')
+ if not os.path.isdir(lib_dir):
+ lib_dir = os.path.join(BOOST_ROOT, 'lib')
+
+ directories['include_dirs'].append(inc_dir)
+ directories['library_dirs'].append(lib_dir)
+
+ directories['libraries'].append(boost_library_name)
- TANGO_ROOT = os.environ.get('TANGO_ROOT', TANGO_ROOT)
- OMNI_ROOT = os.environ.get('OMNI_ROOT', OMNI_ROOT)
- BOOST_ROOT = os.environ.get('BOOST_ROOT', BOOST_ROOT)
- LOG4TANGO_ROOT = os.environ.get('LOG4TANGO_ROOT', LOG4TANGO_ROOT)
- ZMQ_ROOT = os.environ.get('ZMQ_ROOT', ZMQ_ROOT)
+ # special numpy configuration
+
numpy_c_include = get_c_numpy()
+ if numpy_c_include is not None:
+ directories['include_dirs'].append(numpy_c_include)
+
+ if not has_numpy():
+ macros.append(('DISABLE_PYTANGO_NUMPY', None))
+ else:
+ macros.append(('PYTANGO_NUMPY_VERSION', '"' + str(numpy.__version__) + '"'))
+
+ if 'posix' in os.name:
+ directories = pkg_config(*sys_libs, **directories)
Release = get_release_info()
@@ -301,6 +388,7 @@ def main():
'PyTango.ipython',
'PyTango.ipython.ipython_00_10',
'PyTango.ipython.ipython_00_11',
+ 'PyTango.ipython.ipython_10_00',
]
py_modules = []
@@ -317,9 +405,9 @@ def main():
package_data = {
'PyTango' : [],
}
-
+
scripts = get_script_files()
-
+
data_files = []
classifiers = [
@@ -338,229 +426,86 @@ def main():
'Topic :: Scientific/Engineering',
'Topic :: Software Development :: Libraries',
]
-
- #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
- # include directories
- #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-
- include_dirs = [ abspath('src', 'boost', 'cpp') ]
-
- _tango_root_inc = os.path.join(TANGO_ROOT, 'include')
- include_dirs.append(_tango_root_inc)
-
- # $TANGO_ROOT/include/tango exists since tango 7.2.0
- # we changed the PyTango code include statements from:
- # #include <tango.h> to:
- # #include <tango/tango.h>
- # However tango itself complains that it doesn't know his own header files
- # if we don't add the $TANGO_ROOT/include/tango directory to the path. So we do it
- # here
- _tango_root_inc = os.path.join(_tango_root_inc, 'tango')
- if os.path.isdir(_tango_root_inc):
- include_dirs.append(_tango_root_inc)
-
- include_dirs.append(os.path.join(OMNI_ROOT, 'include'))
- if numpy_c_include is not None:
- include_dirs.append(numpy_c_include)
- include_dirs.append(os.path.join(LOG4TANGO_ROOT, 'include'))
-
- #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
- # library directories
- #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
-
- libraries = [
- 'tango',
- 'log4tango',
- 'zmq',
+
+ # Note for PyTango developers:
+ # Compilation time can be greatly reduced by compiling the file
+ # src/precompiled_header.hpp as src/precompiled_header.hpp.gch
+ # and then uncommenting this line. Someday maybe this will be
+ # automated...
+ extra_compile_args = [
+# '-includesrc/precompiled_header.hpp',
]
- extra_compile_args = []
-
- extra_link_args = []
-
- macros = []
-
- if not has_numpy():
- macros.append( ('DISABLE_PYTANGO_NUMPY', None) )
+ extra_link_args = [
+ '-Wl,-h',
+ '-Wl,--strip-all',
+ ]
- library_dirs = []
- for f in (TANGO_ROOT,BOOST_ROOT,LOG4TANGO_ROOT,ZMQ_ROOT):
- is64 = 8 * struct.calcsize("P") == 64
- d = os.path.join(f,'lib')
- if is64:
- d = os.path.join(f,'lib64')
- try:
- if not os.stat(d): raise Exception('%s_doesnt_exist'%d)
- except: d = os.path.join(f,'lib')
- library_dirs.append(d)
-
-# library_dirs = [
-# os.path.join(TANGO_ROOT, 'lib'),
-# os.path.join(BOOST_ROOT, 'lib'),
-# #os.path.join(LOG4TANGO_ROOT, 'lib'),
-# os.path.join(ZMQ_ROOT, 'lib'),
-# ]
-
- if os.name == 'nt':
- include_dirs += [ BOOST_ROOT ]
-
- if please_debug:
- libraries += [
- #'libboost_python-vc80-mt-1_38', Boost in windows autodetects the
- #proper library to link itself with...
- 'omniORB414d_rt',
- 'omniDynamic414d_rt',
- 'omnithread34d_rt',
- 'COS414d_rt',
- ]
- extra_compile_args += []
- extra_link_args += ['/DEBUG']
- macros += [ ('_DEBUG', None) ]
- else:
- libraries += [
- #'libboost_python-vc80-mt-1_38', Boost in windows autodetects the
- #proper library to link itself with...
- 'omniORB414_rt',
- 'omniDynamic414_rt',
- 'omnithread34_rt',
- 'COS414_rt',
- ]
-
- library_dirs += [ os.path.join(OMNI_ROOT, 'lib', 'x86_win32') ]
-
- extra_compile_args += [
- '/EHsc',
- '/wd4005', # supress redefinition of HAVE_STRFTIME between python and omniORB
- '/wd4996', # same as /D_SCL_SECURE_NO_WARNINGS
- '/wd4250', # supress base class inheritance warning
- ]
-
- extra_link_args += []
-
- macros += [
- #('_WINDOWS', None),
- #('_USRDLL', None),
- #('_TANGO_LIB', None),
- #('JPG_USE_ASM', None),
- ('LOG4TANGO_HAS_DLL', None),
- ('TANGO_HAS_DLL', None),
- ('WIN32', None),
- ]
+ if please_debug:
+ extra_compile_args += ['-g', '-O0']
+ extra_link_args += ['-g' , '-O0']
- else:
- if please_debug:
- extra_compile_args += ['-g', '-O0']
- extra_link_args += ['-g' , '-O0']
-
- include_dirs += [ os.path.join(BOOST_ROOT, 'include') ]
+ include_dirs = uniquify(directories['include_dirs'])
+ library_dirs = uniquify(directories['library_dirs'])
+ libraries = uniquify(directories['libraries'])
- libraries += [
- 'pthread',
- 'rt',
- 'dl',
- 'omniORB4',
- 'omniDynamic4',
- 'omnithread',
- 'COS4',
- ]
-
- boost_library_name = 'boost_python'
-
- if 'linux' in sys.platform:
- dist_name = platform.linux_distribution()[0].lower()
- debian_based = 'debian' in dist_name or 'ubuntu' in dist_name
- if debian_based:
- # when building with multiple version of python on debian we need
- # to link against boost_python-py25/-py26 etc...
- pyver = "-py" + "".join(map(str, platform.python_version_tuple()[:2]))
- boost_library_name += pyver
- libraries.append(boost_library_name)
-
- is64 = 8 * struct.calcsize("P") == 64
- omni_lib = os.path.join(OMNI_ROOT, 'lib')
- if is64:
- omni_lib = os.path.join(OMNI_ROOT, 'lib64')
- try:
- if not os.stat(d): raise Exception('%s_doesnt_exist'%d)
- except:
- omni_lib = os.path.join(OMNI_ROOT, 'lib')
- library_dirs += [ omni_lib ]
-
-
- # Note for PyTango developers:
- # Compilation time can be greatly reduced by compiling the file
- # src/precompiled_header.hpp as src/precompiled_header.hpp.gch
- # and then uncommenting this line. Someday maybe this will be
- # automated...
- extra_compile_args += [
-# '-includesrc/precompiled_header.hpp',
- ]
-
- #if not please_debug:
- # extra_compile_args += [ '-g0' ]
-
- extra_link_args += [
- '-Wl,-h',
- '-Wl,--strip-all',
- ]
-
- macros += []
-
- include_dirs = uniquify(include_dirs)
- library_dirs = uniquify(library_dirs)
src_dir = abspath('src', 'boost', 'cpp')
client_dir = src_dir
server_dir = os.path.join(src_dir, 'server')
- _clientfiles = [ os.path.join(client_dir,fname) for fname in os.listdir(client_dir) if fname.endswith('.cpp') ]
+ _clientfiles = [ os.path.join(client_dir, fname)
+ for fname in os.listdir(client_dir)
+ if fname.endswith('.cpp') ]
_clientfiles.sort()
- _serverfiles = [ os.path.join(server_dir,fname) for fname in os.listdir(server_dir) if fname.endswith('.cpp') ]
+ _serverfiles = [ os.path.join(server_dir, fname)
+ for fname in os.listdir(server_dir)
+ if fname.endswith('.cpp') ]
_serverfiles.sort()
_cppfiles = _clientfiles + _serverfiles
-
+
_pytango = Extension(
- name = '_PyTango',
- sources = _cppfiles,
- include_dirs = include_dirs,
- library_dirs = library_dirs,
- libraries = libraries,
- define_macros = macros,
- extra_compile_args = extra_compile_args,
- extra_link_args = extra_link_args,
- language = 'c++',
- depends = [])
+ name='_PyTango',
+ sources=_cppfiles,
+ include_dirs=include_dirs,
+ library_dirs=library_dirs,
+ libraries=libraries,
+ define_macros=macros,
+ extra_compile_args=extra_compile_args,
+ extra_link_args=extra_link_args,
+ language='c++',
+ depends=[])
cmdclass = {'build' : build,
'build_ext' : build_ext,
'install_html' : install_html,
'install' : install }
-
+
if sphinx:
cmdclass['build_doc'] = build_doc
dist = setup(
- name = 'PyTango',
- version = Release.version,
- description = Release.description,
- long_description = Release.long_description,
- author = author[0],
- author_email = author[1],
- url = Release.url,
- download_url = Release.download_url,
- platforms = Release.platform,
- license = Release.license,
- packages = packages,
- package_dir = { 'PyTango' : os.path.join('src', 'boost', 'python') },
- py_modules = py_modules,
- classifiers = classifiers,
- package_data = package_data,
- data_files = data_files,
- scripts = scripts,
- provides = provides,
- keywords = Release.keywords,
- requires = requires,
- ext_package = 'PyTango',
- ext_modules = [_pytango],
- cmdclass = cmdclass)
+ name='PyTango',
+ version=Release.version,
+ description=Release.description,
+ long_description=Release.long_description,
+ author=author[0],
+ author_email=author[1],
+ url=Release.url,
+ download_url=Release.download_url,
+ platforms=Release.platform,
+ license=Release.license,
+ packages=packages,
+ package_dir={ 'PyTango' : os.path.join('src', 'boost', 'python') },
+ py_modules=py_modules,
+ classifiers=classifiers,
+ package_data=package_data,
+ data_files=data_files,
+ scripts=scripts,
+ provides=provides,
+ keywords=Release.keywords,
+ requires=requires,
+ ext_package='PyTango',
+ ext_modules=[_pytango],
+ cmdclass=cmdclass)
if __name__ == "__main__":
main()
diff --git a/src/boost/cpp/api_util.cpp b/src/boost/cpp/api_util.cpp
index d0e4651..d9c550d 100644
--- a/src/boost/cpp/api_util.cpp
+++ b/src/boost/cpp/api_util.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/archive_event_info.cpp b/src/boost/cpp/archive_event_info.cpp
index 78cfc7a..75a8fa4 100644
--- a/src/boost/cpp/archive_event_info.cpp
+++ b/src/boost/cpp/archive_event_info.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
@@ -29,6 +17,7 @@ using namespace boost::python;
void export_archive_event_info()
{
class_<Tango::ArchiveEventInfo>("ArchiveEventInfo")
+ .enable_pickling()
.def_readwrite("archive_rel_change", &Tango::ArchiveEventInfo::archive_rel_change)
.def_readwrite("archive_abs_change", &Tango::ArchiveEventInfo::archive_abs_change)
.def_readwrite("archive_period", &Tango::ArchiveEventInfo::archive_period)
diff --git a/src/boost/cpp/attr_conf_event_data.cpp b/src/boost/cpp/attr_conf_event_data.cpp
index c3441f1..cee7201 100644
--- a/src/boost/cpp/attr_conf_event_data.cpp
+++ b/src/boost/cpp/attr_conf_event_data.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
@@ -30,7 +18,6 @@ void export_attr_conf_event_data()
{
class_<Tango::AttrConfEventData>("AttrConfEventData",
init<const Tango::AttrConfEventData &>())
-
// The original Tango::EventData structure has a 'device' field.
// However, if we returned this directly we would get a different
// python device each time. So we are doing our weird things to make
diff --git a/src/boost/cpp/attribute_alarm_info.cpp b/src/boost/cpp/attribute_alarm_info.cpp
index 48e182f..93557ef 100644
--- a/src/boost/cpp/attribute_alarm_info.cpp
+++ b/src/boost/cpp/attribute_alarm_info.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
@@ -29,6 +17,7 @@ using namespace boost::python;
void export_attribute_alarm_info()
{
class_<Tango::AttributeAlarmInfo>("AttributeAlarmInfo")
+ .enable_pickling()
.def_readwrite("min_alarm", &Tango::AttributeAlarmInfo::min_alarm)
.def_readwrite("max_alarm", &Tango::AttributeAlarmInfo::max_alarm)
.def_readwrite("min_warning", &Tango::AttributeAlarmInfo::min_warning)
diff --git a/src/boost/cpp/attribute_dimension.cpp b/src/boost/cpp/attribute_dimension.cpp
index cfc123a..1e03935 100644
--- a/src/boost/cpp/attribute_dimension.cpp
+++ b/src/boost/cpp/attribute_dimension.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/attribute_event_info.cpp b/src/boost/cpp/attribute_event_info.cpp
index b617f8c..cfcb4f6 100644
--- a/src/boost/cpp/attribute_event_info.cpp
+++ b/src/boost/cpp/attribute_event_info.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
@@ -29,6 +17,7 @@ using namespace boost::python;
void export_attribute_event_info()
{
class_<Tango::AttributeEventInfo>("AttributeEventInfo")
+ .enable_pickling()
.def_readwrite("ch_event", &Tango::AttributeEventInfo::ch_event)
.def_readwrite("per_event", &Tango::AttributeEventInfo::per_event)
.def_readwrite("arch_event", &Tango::AttributeEventInfo::arch_event)
diff --git a/src/boost/cpp/attribute_info.cpp b/src/boost/cpp/attribute_info.cpp
index 215ef9c..1a03ded 100644
--- a/src/boost/cpp/attribute_info.cpp
+++ b/src/boost/cpp/attribute_info.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
@@ -31,6 +19,7 @@ void export_attribute_info()
class_<Tango::AttributeInfo, bases<Tango::DeviceAttributeConfig> >
("AttributeInfo")
.def(init<const Tango::AttributeInfo&>())
+ .enable_pickling()
.def_readwrite("disp_level", &Tango::AttributeInfo::disp_level)
;
}
diff --git a/src/boost/cpp/attribute_info_ex.cpp b/src/boost/cpp/attribute_info_ex.cpp
index eab4c13..bdec946 100644
--- a/src/boost/cpp/attribute_info_ex.cpp
+++ b/src/boost/cpp/attribute_info_ex.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
@@ -31,6 +19,7 @@ void export_attribute_info_ex()
class_<Tango::AttributeInfoEx, bases<Tango::AttributeInfo> >
("AttributeInfoEx")
.def(init<const Tango::AttributeInfoEx&>())
+ .enable_pickling()
.def_readwrite("alarms", &Tango::AttributeInfoEx::alarms)
.def_readwrite("events", &Tango::AttributeInfoEx::events)
.def_readwrite("sys_extensions", &Tango::AttributeInfoEx::sys_extensions)
diff --git a/src/boost/cpp/attribute_proxy.cpp b/src/boost/cpp/attribute_proxy.cpp
index 1890076..8beaf9c 100644
--- a/src/boost/cpp/attribute_proxy.cpp
+++ b/src/boost/cpp/attribute_proxy.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "defs.h"
diff --git a/src/boost/cpp/base_types.cpp b/src/boost/cpp/base_types.cpp
index b2fd009..c1586c4 100644
--- a/src/boost/cpp/base_types.cpp
+++ b/src/boost/cpp/base_types.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "defs.h"
@@ -188,6 +176,12 @@ void export_base_types()
.value("Nothing", PyTango::ExtractAsNothing)
;
+ enum_<PyTango::GreenMode>("GreenMode")
+ .value("Synchronous", PyTango::GreenModeSynchronous)
+ .value("Futures", PyTango::GreenModeFutures)
+ .value("Gevent", PyTango::GreenModeGevent)
+ ;
+
enum_<PyTango::ImageFormat>("_ImageFormat")
.value("RawImage", PyTango::RawImage)
.value("JpegImage", PyTango::JpegImage)
@@ -351,4 +345,6 @@ void export_base_types()
export_time_val();
def("raise_asynch_exception", &raise_asynch_exception);
+
+ def("_get_tango_lib_release", &Tango::_convert_tango_lib_release);
}
diff --git a/src/boost/cpp/base_types_numpy.hpp b/src/boost/cpp/base_types_numpy.hpp
index b2366f5..9f0a8d7 100644
--- a/src/boost/cpp/base_types_numpy.hpp
+++ b/src/boost/cpp/base_types_numpy.hpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#pragma once
diff --git a/src/boost/cpp/callback.cpp b/src/boost/cpp/callback.cpp
index 486d363..59ae207 100644
--- a/src/boost/cpp/callback.cpp
+++ b/src/boost/cpp/callback.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "pytgutils.h"
diff --git a/src/boost/cpp/callback.h b/src/boost/cpp/callback.h
index e478ffe..7c2e21d 100644
--- a/src/boost/cpp/callback.h
+++ b/src/boost/cpp/callback.h
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#pragma once
diff --git a/src/boost/cpp/change_event_info.cpp b/src/boost/cpp/change_event_info.cpp
index 261355b..7d808e1 100644
--- a/src/boost/cpp/change_event_info.cpp
+++ b/src/boost/cpp/change_event_info.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
@@ -29,6 +17,7 @@ using namespace boost::python;
void export_change_event_info()
{
class_<Tango::ChangeEventInfo>("ChangeEventInfo")
+ .enable_pickling()
.def_readwrite("rel_change", &Tango::ChangeEventInfo::rel_change)
.def_readwrite("abs_change", &Tango::ChangeEventInfo::abs_change)
.def_readwrite("extensions", &Tango::ChangeEventInfo::extensions)
diff --git a/src/boost/cpp/command_info.cpp b/src/boost/cpp/command_info.cpp
index a912fbd..b9e638f 100644
--- a/src/boost/cpp/command_info.cpp
+++ b/src/boost/cpp/command_info.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/connection.cpp b/src/boost/cpp/connection.cpp
index a8ca2c4..a7fc450 100644
--- a/src/boost/cpp/connection.cpp
+++ b/src/boost/cpp/connection.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "pytgutils.h"
diff --git a/src/boost/cpp/constants.cpp b/src/boost/cpp/constants.cpp
index e771477..9717a23 100644
--- a/src/boost/cpp/constants.cpp
+++ b/src/boost/cpp/constants.cpp
@@ -1,28 +1,17 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
+#include "tango_numpy.h"
using namespace boost::python;
@@ -39,10 +28,24 @@ void export_constants()
#ifdef DISABLE_PYTANGO_NUMPY
consts_scope.attr("NUMPY_SUPPORT") = false;
+ consts_scope.attr("NUMPY_VERSION") = "0.0.0";
#else
consts_scope.attr("NUMPY_SUPPORT") = true;
+ consts_scope.attr("NUMPY_VERSION") = PYTANGO_NUMPY_VERSION;
#endif
+ consts_scope.attr("PY_MAJOR_VERSION") = PY_MAJOR_VERSION;
+ consts_scope.attr("PY_MINOR_VERSION") = PY_MINOR_VERSION;
+ consts_scope.attr("PY_MICRO_VERSION") = PY_MICRO_VERSION;
+ consts_scope.attr("PY_VERSION") = PY_VERSION;
+ consts_scope.attr("PY_VERSION_HEX") = PY_VERSION_HEX;
+
+ consts_scope.attr("BOOST_MAJOR_VERSION") = BOOST_VERSION / 100000;
+ consts_scope.attr("BOOST_MINOR_VERSION") = BOOST_VERSION / 100 % 1000;
+ consts_scope.attr("BOOST_PATCH_VERSION") = BOOST_VERSION % 100;
+ // missing BOOST_VERSION => do it in python
+
+
//
// From tango_const.h
//
@@ -53,8 +56,10 @@ void export_constants()
consts_scope.attr("TANGO_VERSION_MAJOR") = TANGO_VERSION_MAJOR;
consts_scope.attr("TANGO_VERSION_MINOR") = TANGO_VERSION_MINOR;
consts_scope.attr("TANGO_VERSION_PATCH") = TANGO_VERSION_PATCH;
-
+ consts_scope.attr("TANGO_VERSION") = TgLibVers;
+
consts_scope.attr("TgLibVers") = TgLibVers;
+ consts_scope.attr("TgLibVersNb") = TgLibVersNb;
consts_scope.attr("DevVersion") = DevVersion;
consts_scope.attr("DefaultMaxSeq") = DefaultMaxSeq;
consts_scope.attr("DefaultBlackBoxDepth") = DefaultBlackBoxDepth;
@@ -188,7 +193,15 @@ void export_constants()
consts_scope.attr("UnitNotSpec") = UnitNotSpec;
consts_scope.attr("StdUnitNotSpec") = StdUnitNotSpec;
consts_scope.attr("DispUnitNotSpec") = DispUnitNotSpec;
+#ifdef FormatNotSpec
consts_scope.attr("FormatNotSpec") = FormatNotSpec;
+#else
+ consts_scope.attr("FormatNotSpec") = FormatNotSpec_FL;
+#endif
+ consts_scope.attr("FormatNotSpec_FL") = FormatNotSpec_FL;
+ consts_scope.attr("FormatNotSpec_INT") = FormatNotSpec_INT;
+ consts_scope.attr("FormatNotSpec_STR") = FormatNotSpec_STR;
+
consts_scope.attr("NotANumber") = NotANumber;
consts_scope.attr("MemNotUsed") = MemNotUsed;
consts_scope.attr("MemAttrPropName") = MemAttrPropName;
@@ -201,73 +214,73 @@ void export_constants()
consts_scope.attr("TANGO_LONG64") = false;
#endif
- consts_scope.attr("API_AttrConfig") = "API_AttrConfig";
- consts_scope.attr("API_AttrEventProp") = "API_AttrEventProp";
- consts_scope.attr("API_AttrIncorrectDataNumber") = "API_AttrIncorrectDataNumber";
- consts_scope.attr("API_AttrNoAlarm") = "API_AttrNoAlarm";
- consts_scope.attr("API_AttrNotAllowed") = "API_AttrNotAllowed";
- consts_scope.attr("API_AttrNotFound") = "API_AttrNotFound";
- consts_scope.attr("API_AttrNotWritable") = "API_AttrNotWritable";
- consts_scope.attr("API_AttrOptProp") = "API_AttrOptProp";
- consts_scope.attr("API_AttrPropValueNotSet") = "API_AttrPropValueNotSet";
- consts_scope.attr("API_AttrValueNotSet") = "API_AttrValueNotSet";
- consts_scope.attr("API_AttrWrongDefined") = "API_AttrWrongDefined";
- consts_scope.attr("API_AttrWrongMemValue") = "API_AttrWrongMemValue";
- consts_scope.attr("API_BadConfigurationProperty") = "API_BadConfigurationProperty";
- consts_scope.attr("API_BlackBoxArgument") = "API_BlackBoxArgument";
- consts_scope.attr("API_BlackBoxEmpty") = "API_BlackBoxEmpty";
- consts_scope.attr("API_CannotCheckAccessControl") = "API_CannotCheckAccessControl";
- consts_scope.attr("API_CannotOpenFile") = "API_CannotOpenFile";
- consts_scope.attr("API_CantActivatePOAManager") = "API_CantActivatePOAManager";
- consts_scope.attr("API_CantCreateClassPoa") = "API_CantCreateClassPoa";
- consts_scope.attr("API_CantCreateLockingThread") = "API_CantCreateLockingThread";
- consts_scope.attr("API_CantFindLockingThread") = "API_CantFindLockingThread";
- consts_scope.attr("API_CantGetClientIdent") = "API_CantGetClientIdent";
- consts_scope.attr("API_CantGetDevObjectId") = "API_CantGetDevObjectId";
- consts_scope.attr("API_CantInstallSignal") = "API_CantInstallSignal";
- consts_scope.attr("API_CantRetrieveClass") = "API_CantRetrieveClass";
- consts_scope.attr("API_CantRetrieveClassList") = "API_CantRetrieveClassList";
- consts_scope.attr("API_CantStoreDeviceClass") = "API_CantStoreDeviceClass";
- consts_scope.attr("API_ClassNotFound") = "API_ClassNotFound";
- consts_scope.attr("API_CmdArgumentTypeNotSupported") = "API_CmdArgumentTypeNotSupported";
- consts_scope.attr("API_CommandNotAllowed") = "API_CommandNotAllowed";
- consts_scope.attr("API_CommandNotFound") = "API_CommandNotFound";
- consts_scope.attr("API_CorbaSysException") = "API_CorbaSysException";
- consts_scope.attr("API_CorruptedDatabase") = "API_CorruptedDatabase";
- consts_scope.attr("API_DatabaseAccess") = "API_DatabaseAccess";
- consts_scope.attr("API_DeviceLocked") = "API_DeviceLocked";
- consts_scope.attr("API_DeviceNotFound") = "API_DeviceNotFound";
- consts_scope.attr("API_DeviceNotLocked") = "API_DeviceNotLocked";
- consts_scope.attr("API_DeviceUnlockable") = "API_DeviceUnlockable";
- consts_scope.attr("API_DeviceUnlocked") = "API_DeviceUnlocked";
- consts_scope.attr("API_EventSupplierNotConstructed") = "API_EventSupplierNotConstructed";
- consts_scope.attr("API_IncoherentDbData") = "API_IncoherentDbData";
- consts_scope.attr("API_IncoherentDevData") = "API_IncoherentDevData";
- consts_scope.attr("API_IncoherentValues") = "API_IncoherentValues";
- consts_scope.attr("API_IncompatibleAttrDataType") = "API_IncompatibleAttrDataType";
- consts_scope.attr("API_IncompatibleCmdArgumentType") = "API_IncompatibleCmdArgumentType";
- consts_scope.attr("API_InitMethodNotFound") = "API_InitMethodNotFound";
- consts_scope.attr("API_InitNotPublic") = "API_InitNotPublic";
- consts_scope.attr("API_InitThrowsException") = "API_InitThrowsException";
- consts_scope.attr("API_JavaRuntimeSecurityException") = "API_JavaRuntimeSecurityException";
- consts_scope.attr("API_MemoryAllocation") = "API_MemoryAllocation";
- consts_scope.attr("API_MethodArgument") = "API_MethodArgument";
- consts_scope.attr("API_MethodNotFound") = "API_MethodNotFound";
- consts_scope.attr("API_MissedEvents") = "API_MissedEvents";
- consts_scope.attr("API_NotSupportedFeature") = "API_NotSupportedFeature";
- consts_scope.attr("API_NtDebugWindowError") = "API_NtDebugWindowError";
- consts_scope.attr("API_OverloadingNotSupported") = "API_OverloadingNotSupported";
- consts_scope.attr("API_PolledDeviceNotInPoolConf") = "API_PolledDeviceNotInPoolConf";
- consts_scope.attr("API_PolledDeviceNotInPoolMap") = "API_PolledDeviceNotInPoolMap";
- consts_scope.attr("API_PollingThreadNotFound") = "API_PollingThreadNotFound";
- consts_scope.attr("API_ReadOnlyMode") = "API_ReadOnlyMode";
- consts_scope.attr("API_SignalOutOfRange") = "API_SignalOutOfRange";
- consts_scope.attr("API_SystemCallFailed") = "API_SystemCallFailed";
- consts_scope.attr("API_WAttrOutsideLimit") = "API_WAttrOutsideLimit";
- consts_scope.attr("API_WizardConfError") = "API_WizardConfError";
- consts_scope.attr("API_WrongEventData") = "API_WrongEventData";
- consts_scope.attr("API_WrongHistoryDataBuffer") = "API_WrongHistoryDataBuffer";
- consts_scope.attr("API_WrongLockingStatus") = "API_WrongLockingStatus";
- consts_scope.attr("API_ZmqInitFailed") = "API_ZmqInitFailed";
+ consts_scope.attr("API_AttrConfig") = API_AttrConfig;
+ consts_scope.attr("API_AttrEventProp") = API_AttrEventProp;
+ consts_scope.attr("API_AttrIncorrectDataNumber") = API_AttrIncorrectDataNumber;
+ consts_scope.attr("API_AttrNoAlarm") = API_AttrNoAlarm;
+ consts_scope.attr("API_AttrNotAllowed") = API_AttrNotAllowed;
+ consts_scope.attr("API_AttrNotFound") = API_AttrNotFound;
+ consts_scope.attr("API_AttrNotWritable") = API_AttrNotWritable;
+ consts_scope.attr("API_AttrOptProp") = API_AttrOptProp;
+ consts_scope.attr("API_AttrPropValueNotSet") = API_AttrPropValueNotSet;
+ consts_scope.attr("API_AttrValueNotSet") = API_AttrValueNotSet;
+ consts_scope.attr("API_AttrWrongDefined") = API_AttrWrongDefined;
+ consts_scope.attr("API_AttrWrongMemValue") = API_AttrWrongMemValue;
+ consts_scope.attr("API_BadConfigurationProperty") = API_BadConfigurationProperty;
+ consts_scope.attr("API_BlackBoxArgument") = API_BlackBoxArgument;
+ consts_scope.attr("API_BlackBoxEmpty") = API_BlackBoxEmpty;
+ consts_scope.attr("API_CannotCheckAccessControl") = API_CannotCheckAccessControl;
+ consts_scope.attr("API_CannotOpenFile") = API_CannotOpenFile;
+ consts_scope.attr("API_CantActivatePOAManager") = API_CantActivatePOAManager;
+ consts_scope.attr("API_CantCreateClassPoa") = API_CantCreateClassPoa;
+ consts_scope.attr("API_CantCreateLockingThread") = API_CantCreateLockingThread;
+ consts_scope.attr("API_CantFindLockingThread") = API_CantFindLockingThread;
+ consts_scope.attr("API_CantGetClientIdent") = API_CantGetClientIdent;
+ consts_scope.attr("API_CantGetDevObjectId") = API_CantGetDevObjectId;
+ consts_scope.attr("API_CantInstallSignal") = API_CantInstallSignal;
+ consts_scope.attr("API_CantRetrieveClass") = API_CantRetrieveClass;
+ consts_scope.attr("API_CantRetrieveClassList") = API_CantRetrieveClassList;
+ consts_scope.attr("API_CantStoreDeviceClass") = API_CantStoreDeviceClass;
+ consts_scope.attr("API_ClassNotFound") = API_ClassNotFound;
+ consts_scope.attr("API_CmdArgumentTypeNotSupported") = API_CmdArgumentTypeNotSupported;
+ consts_scope.attr("API_CommandNotAllowed") = API_CommandNotAllowed;
+ consts_scope.attr("API_CommandNotFound") = API_CommandNotFound;
+ consts_scope.attr("API_CorbaSysException") = API_CorbaSysException;
+ consts_scope.attr("API_CorruptedDatabase") = API_CorruptedDatabase;
+ consts_scope.attr("API_DatabaseAccess") = API_DatabaseAccess;
+ consts_scope.attr("API_DeviceLocked") = API_DeviceLocked;
+ consts_scope.attr("API_DeviceNotFound") = API_DeviceNotFound;
+ consts_scope.attr("API_DeviceNotLocked") = API_DeviceNotLocked;
+ consts_scope.attr("API_DeviceUnlockable") = API_DeviceUnlockable;
+ consts_scope.attr("API_DeviceUnlocked") = API_DeviceUnlocked;
+ consts_scope.attr("API_EventSupplierNotConstructed") = API_EventSupplierNotConstructed;
+ consts_scope.attr("API_IncoherentDbData") = API_IncoherentDbData;
+ consts_scope.attr("API_IncoherentDevData") = API_IncoherentDevData;
+ consts_scope.attr("API_IncoherentValues") = API_IncoherentValues;
+ consts_scope.attr("API_IncompatibleAttrDataType") = API_IncompatibleAttrDataType;
+ consts_scope.attr("API_IncompatibleCmdArgumentType") = API_IncompatibleCmdArgumentType;
+ consts_scope.attr("API_InitMethodNotFound") = API_InitMethodNotFound;
+ consts_scope.attr("API_InitNotPublic") = API_InitNotPublic;
+ consts_scope.attr("API_InitThrowsException") = API_InitThrowsException;
+ consts_scope.attr("API_JavaRuntimeSecurityException") = API_JavaRuntimeSecurityException;
+ consts_scope.attr("API_MemoryAllocation") = API_MemoryAllocation;
+ consts_scope.attr("API_MethodArgument") = API_MethodArgument;
+ consts_scope.attr("API_MethodNotFound") = API_MethodNotFound;
+ consts_scope.attr("API_MissedEvents") = API_MissedEvents;
+ consts_scope.attr("API_NotSupportedFeature") = API_NotSupportedFeature;
+ consts_scope.attr("API_NtDebugWindowError") = API_NtDebugWindowError;
+ consts_scope.attr("API_OverloadingNotSupported") = API_OverloadingNotSupported;
+ consts_scope.attr("API_PolledDeviceNotInPoolConf") = API_PolledDeviceNotInPoolConf;
+ consts_scope.attr("API_PolledDeviceNotInPoolMap") = API_PolledDeviceNotInPoolMap;
+ consts_scope.attr("API_PollingThreadNotFound") = API_PollingThreadNotFound;
+ consts_scope.attr("API_ReadOnlyMode") = API_ReadOnlyMode;
+ consts_scope.attr("API_SignalOutOfRange") = API_SignalOutOfRange;
+ consts_scope.attr("API_SystemCallFailed") = API_SystemCallFailed;
+ consts_scope.attr("API_WAttrOutsideLimit") = API_WAttrOutsideLimit;
+ consts_scope.attr("API_WizardConfError") = API_WizardConfError;
+ consts_scope.attr("API_WrongEventData") = API_WrongEventData;
+ consts_scope.attr("API_WrongHistoryDataBuffer") = API_WrongHistoryDataBuffer;
+ consts_scope.attr("API_WrongLockingStatus") = API_WrongLockingStatus;
+ consts_scope.attr("API_ZmqInitFailed") = API_ZmqInitFailed;
}
diff --git a/src/boost/cpp/data_ready_event_data.cpp b/src/boost/cpp/data_ready_event_data.cpp
index 047770d..073e395 100644
--- a/src/boost/cpp/data_ready_event_data.cpp
+++ b/src/boost/cpp/data_ready_event_data.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/database.cpp b/src/boost/cpp/database.cpp
index c7b1910..88ab1c9 100644
--- a/src/boost/cpp/database.cpp
+++ b/src/boost/cpp/database.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "defs.h"
@@ -125,6 +113,38 @@ struct PyDatabase
//{
// return boost::python::str(self.get_file_name());
//}
+
+ static inline boost::python::str
+ get_device_from_alias(Tango::Database& self, const std::string &input)
+ {
+ std::string output;
+ self.get_device_from_alias(input, output);
+ return boost::python::str(output);
+ }
+
+ static inline boost::python::str
+ get_alias_from_device(Tango::Database& self, const std::string &input)
+ {
+ std::string output;
+ self.get_alias_from_device(input, output);
+ return boost::python::str(output);
+ }
+
+ static inline boost::python::str
+ get_attribute_from_alias(Tango::Database& self, const std::string &input)
+ {
+ std::string output;
+ self.get_attribute_from_alias(input, output);
+ return boost::python::str(output);
+ }
+
+ static inline boost::python::str
+ get_alias_from_attribute(Tango::Database& self, const std::string &input)
+ {
+ std::string output;
+ self.get_alias_from_attribute(input, output);
+ return boost::python::str(output);
+ }
};
void export_database()
@@ -137,6 +157,8 @@ void export_database()
&Tango::Database::get_host_list;
Tango::DbDatum (Tango::Database::*get_services_)(std::string &, std::string &) =
&Tango::Database::get_services;
+ Tango::DbDatum (Tango::Database::*get_device_service_list_)(std::string &) =
+ &Tango::Database::get_device_service_list;
void (Tango::Database::*register_service_)(std::string &, std::string &, std::string &) =
&Tango::Database::register_service;
void (Tango::Database::*unregister_service_)(std::string &, std::string &) =
@@ -208,6 +230,8 @@ void export_database()
Tango::DbDevImportInfo (Tango::Database::*import_device_)(std::string &) =
&Tango::Database::import_device;
+ Tango::DbDevFullInfo (Tango::Database::*get_device_info_)(std::string &) =
+ &Tango::Database::get_device_info;
Tango::DbDatum (Tango::Database::*get_attribute_alias_list_)(std::string &) =
&Tango::Database::get_attribute_alias_list;
@@ -264,6 +288,9 @@ void export_database()
.def("get_services",
(Tango::DbDatum (Tango::Database::*) (const std::string &, const std::string &))
get_services_)
+ .def("get_device_service_list",
+ (Tango::DbDatum (Tango::Database::*) (const std::string &))
+ get_device_service_list_)
.def("register_service",
(void (Tango::Database::*) (const std::string &, const std::string &, const std::string &))
register_service_)
@@ -277,10 +304,14 @@ void export_database()
.def("add_device", &Tango::Database::add_device)
.def("delete_device", &Tango::Database::delete_device)
- .def("import_device", (Tango::DbDevImportInfo (Tango::Database::*) (const std::string &))
- import_device_)
+ .def("import_device",
+ (Tango::DbDevImportInfo (Tango::Database::*) (const std::string &))
+ import_device_)
.def("export_device", &Tango::Database::export_device)
.def("unexport_device", &Tango::Database::unexport_device)
+ .def("get_device_info",
+ (Tango::DbDevFullInfo (Tango::Database::*) (const std::string &))
+ get_device_info_)
.def("get_device_name",
(Tango::DbDatum (Tango::Database::*) (const string &, const string &))
get_device_name_)
@@ -316,7 +347,7 @@ void export_database()
.def("delete_device_alias",
(void (Tango::Database::*) (const std::string &))
delete_device_alias_)
-
+
//
// server methods
//
@@ -331,6 +362,8 @@ void export_database()
.def("unexport_server",
(void (Tango::Database::*) (const std::string &))
unexport_server_)
+ .def("rename_server", &Tango::Database::rename_server,
+ ( arg_("self"), arg_("old_ds_name"), arg_("new_ds_name") ))
.def("get_server_info",
(Tango::DbServerInfo (Tango::Database::*) (const std::string &))
get_server_info_)
@@ -453,6 +486,14 @@ void export_database()
.def("unexport_event",
(void (Tango::Database::*) (const std::string &))
&Tango::Database::unexport_event)
+
+// alias methods
+
+ .def("get_device_from_alias", &PyDatabase::get_device_from_alias)
+ .def("get_alias_from_device", &PyDatabase::get_alias_from_device)
+ .def("get_attribute_from_alias", &PyDatabase::get_attribute_from_alias)
+ .def("get_alias_from_attribute", &PyDatabase::get_alias_from_attribute)
+
;
}
diff --git a/src/boost/cpp/db.cpp b/src/boost/cpp/db.cpp
index fcf2b44..5dc2adc 100644
--- a/src/boost/cpp/db.cpp
+++ b/src/boost/cpp/db.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "defs.h"
@@ -29,6 +17,15 @@ using namespace boost::python;
void export_database();
+namespace PyDbServerData {
+
+ static inline boost::python::str get_name(Tango::DbServerData &self)
+ {
+ return boost::python::str(self.get_name());
+ }
+
+};
+
void export_db()
{
// Note: DbDatum in python is extended to support the python sequence API
@@ -59,8 +56,16 @@ void export_db()
.def_readonly("ior", &Tango::DbDevImportInfo::ior)
.def_readonly("version", &Tango::DbDevImportInfo::version)
;
+
+ class_<Tango::DbDevFullInfo, bases<Tango::DbDevImportInfo> >("DbDevFullInfo")
+ .def_readonly("class_name", &Tango::DbDevFullInfo::class_name)
+ .def_readonly("ds_full_name", &Tango::DbDevFullInfo::ds_full_name)
+ .def_readonly("started_date", &Tango::DbDevFullInfo::started_date)
+ .def_readonly("stopped_date", &Tango::DbDevFullInfo::stopped_date)
+ .def_readonly("pid", &Tango::DbDevFullInfo::pid)
+ ;
- class_<Tango::DbDevInfo>("DbDevInfo")
+ class_<Tango::DbDevInfo>("DbDevInfo")
.def_readwrite("name", &Tango::DbDevInfo::name)
.def_readwrite("_class", &Tango::DbDevInfo::_class)
.def_readwrite("klass", &Tango::DbDevInfo::_class)
@@ -78,10 +83,23 @@ void export_db()
;
class_<Tango::DbServerInfo>("DbServerInfo")
- .def_readwrite("name", &Tango::DbServerInfo::name)
- .def_readwrite("host", &Tango::DbServerInfo::host)
- .def_readwrite("mode", &Tango::DbServerInfo::mode)
- .def_readwrite("level", &Tango::DbServerInfo::level)
+ .def_readwrite("name", &Tango::DbServerInfo::name)
+ .def_readwrite("host", &Tango::DbServerInfo::host)
+ .def_readwrite("mode", &Tango::DbServerInfo::mode)
+ .def_readwrite("level", &Tango::DbServerInfo::level)
+ ;
+
+ class_<Tango::DbServerData>("DbServerData",
+ init<const std::string, const std::string>())
+ .def("get_name", &PyDbServerData::get_name)
+ .def("put_in_database", &Tango::DbServerData::put_in_database)
+ .def("already_exist", &Tango::DbServerData::already_exist)
+ .def("remove",
+ (void (Tango::DbServerData::*) ())
+ &Tango::DbServerData::remove)
+ .def("remove",
+ (void (Tango::DbServerData::*) (const std::string &))
+ &Tango::DbServerData::remove)
;
export_database();
diff --git a/src/boost/cpp/defs.h b/src/boost/cpp/defs.h
index 4f20c7c..8dfa3a9 100644
--- a/src/boost/cpp/defs.h
+++ b/src/boost/cpp/defs.h
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#pragma once
@@ -56,6 +44,7 @@ namespace PyTango
ExtractAsTuple,
ExtractAsList,
ExtractAsString,
+ ExtractAsPyTango3,
ExtractAsNothing
};
@@ -63,4 +52,10 @@ namespace PyTango
RawImage,
JpegImage
};
+
+ enum GreenMode {
+ GreenModeSynchronous,
+ GreenModeFutures,
+ GreenModeGevent
+ };
}
diff --git a/src/boost/cpp/dev_command_info.cpp b/src/boost/cpp/dev_command_info.cpp
index 91d3c11..c9c6b7e 100644
--- a/src/boost/cpp/dev_command_info.cpp
+++ b/src/boost/cpp/dev_command_info.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/dev_error.cpp b/src/boost/cpp/dev_error.cpp
index c630721..0968315 100644
--- a/src/boost/cpp/dev_error.cpp
+++ b/src/boost/cpp/dev_error.cpp
@@ -1,49 +1,60 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "pyutils.h"
#include <tango.h>
-struct PyDevError
+namespace PyDevError
{
- static inline PyObject* get_reason(Tango::DevError &de)
- { return from_char_to_str(de.reason); }
-
- static inline PyObject* get_desc(Tango::DevError &de)
- { return from_char_to_str(de.desc); }
-
- static inline PyObject* get_origin(Tango::DevError &de)
- { return from_char_to_str(de.origin); }
-
+ static void from_str_to_char(PyObject* in, CORBA::String_member& out)
+ {
+ if (PyUnicode_Check(in))
+ {
+ PyObject *bytes_in = PyUnicode_AsLatin1String(in);
+ out = CORBA::string_dup(PyBytes_AsString(bytes_in));
+ Py_DECREF(bytes_in);
+ }
+ else
+ {
+ out = CORBA::string_dup(PyBytes_AsString(in));
+ }
+ }
+
+ static inline PyObject* get_reason(Tango::DevError &self)
+ { return from_char_to_str(self.reason); }
+
+ static inline void set_reason(Tango::DevError &self, PyObject *str)
+ { PyDevError::from_str_to_char(str, self.reason); }
+
+ static inline PyObject* get_desc(Tango::DevError &self)
+ { return from_char_to_str(self.desc); }
+
+ static inline void set_desc(Tango::DevError &self, PyObject *str)
+ { PyDevError::from_str_to_char(str, self.desc); }
+
+ static inline PyObject* get_origin(Tango::DevError &self)
+ { return from_char_to_str(self.origin); }
+
+ static inline void set_origin(Tango::DevError &self, PyObject *str)
+ { PyDevError::from_str_to_char(str, self.origin); }
};
void export_dev_error()
{
bopy::class_<Tango::DevError>("DevError")
- .add_property("reason", &PyDevError::get_reason)
- .def_readonly("severity", &Tango::DevError::severity)
- .add_property("desc", &PyDevError::get_desc)
- .add_property("origin", &PyDevError::get_origin)
+ .enable_pickling()
+ .add_property("reason", &PyDevError::get_reason, &PyDevError::set_reason)
+ .def_readwrite("severity", &Tango::DevError::severity)
+ .add_property("desc", &PyDevError::get_desc, &PyDevError::set_desc)
+ .add_property("origin", &PyDevError::get_origin, &PyDevError::set_origin)
;
}
diff --git a/src/boost/cpp/device_attribute.cpp b/src/boost/cpp/device_attribute.cpp
index c61ff74..b7a3b61 100644
--- a/src/boost/cpp/device_attribute.cpp
+++ b/src/boost/cpp/device_attribute.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "device_attribute.h"
@@ -624,7 +612,8 @@ namespace PyDeviceAttribute
if (isImage) {
for(CORBA::ULong y = 0; y < dim_y; ++y) {
object py_sub = py_value[y];
- if (len(py_sub) != dim_x)
+ CORBA::ULong len_py_sub = static_cast<CORBA::ULong>(boost::python::len(py_sub));
+ if (len_py_sub != dim_x)
raise_(PyExc_TypeError, non_valid_image);
for(CORBA::ULong x = 0; x < dim_x; ++x) {
python_tangocpp<tangoTypeConst>::to_cpp(py_sub[x], buffer[x + y*dim_x]);
diff --git a/src/boost/cpp/device_attribute.h b/src/boost/cpp/device_attribute.h
index 83a95ca..23828ee 100644
--- a/src/boost/cpp/device_attribute.h
+++ b/src/boost/cpp/device_attribute.h
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#pragma once
@@ -41,7 +29,7 @@ namespace PyDeviceAttribute {
typedef unique_pointer<std::vector<Tango::DeviceAttribute> > AutoDevAttrVector;
/// @}
- template<long tangoTypeConst>
+ template<long tangoTypeConst> static
void _update_array_values_as_tuples(Tango::DeviceAttribute &self, bool isImage, boost::python::object py_value);
/// Set the value of a DeviceAttribute from python (useful for write*)
diff --git a/src/boost/cpp/device_attribute_config.cpp b/src/boost/cpp/device_attribute_config.cpp
index 9ad336c..f7d7d0d 100644
--- a/src/boost/cpp/device_attribute_config.cpp
+++ b/src/boost/cpp/device_attribute_config.cpp
@@ -1,35 +1,25 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
-#include <tango.h>
-
-using namespace boost::python;
+#include "pytgutils.h"
void export_device_attribute_config()
{
- class_<Tango::DeviceAttributeConfig>("DeviceAttributeConfig")
- .def(init<const Tango::DeviceAttributeConfig&>())
+ bopy::class_<Tango::DeviceAttributeConfig>("DeviceAttributeConfig")
+ .def(bopy::init<const Tango::DeviceAttributeConfig&>())
+
+ .enable_pickling()
+// .def_pickle(PyDeviceAttributeConfig::PickleSuite())
+
.def_readwrite("name", &Tango::DeviceAttributeConfig::name)
.def_readwrite("writable", &Tango::DeviceAttributeConfig::writable)
.def_readwrite("data_format", &Tango::DeviceAttributeConfig::data_format)
@@ -38,8 +28,10 @@ void export_device_attribute_config()
.def_readwrite("max_dim_y", &Tango::DeviceAttributeConfig::max_dim_y)
.def_readwrite("description", &Tango::DeviceAttributeConfig::description)
//.def_readwrite("label", &Tango::DeviceAttributeConfig::label)
- .add_property("label", make_getter(&Tango::DeviceAttributeConfig::label, return_value_policy<return_by_value>()),
- make_setter(&Tango::DeviceAttributeConfig::label, return_value_policy<return_by_value>()))
+ .add_property("label", bopy::make_getter(&Tango::DeviceAttributeConfig::label,
+ bopy::return_value_policy<bopy::return_by_value>()),
+ bopy::make_setter(&Tango::DeviceAttributeConfig::label,
+ bopy::return_value_policy<bopy::return_by_value>()))
.def_readwrite("unit", &Tango::DeviceAttributeConfig::unit)
.def_readwrite("standard_unit", &Tango::DeviceAttributeConfig::standard_unit)
.def_readwrite("display_unit", &Tango::DeviceAttributeConfig::display_unit)
diff --git a/src/boost/cpp/device_attribute_history.cpp b/src/boost/cpp/device_attribute_history.cpp
index a86c9ef..16c01bb 100644
--- a/src/boost/cpp/device_attribute_history.cpp
+++ b/src/boost/cpp/device_attribute_history.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/device_attribute_numpy.hpp b/src/boost/cpp/device_attribute_numpy.hpp
index 9932620..6ccd9e3 100644
--- a/src/boost/cpp/device_attribute_numpy.hpp
+++ b/src/boost/cpp/device_attribute_numpy.hpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
// This header file is just some template functions moved apart from
@@ -239,16 +227,18 @@ namespace PyDeviceAttribute {
// x and y position it corresponded! Yes, 'iter' has a coordinates
// field, but it was always [0,0], never updated!!
npy_intp coordinates[2];
- Py_ssize_t &x = coordinates[1];
- Py_ssize_t &y = coordinates[0];
- for (y=0; y < dim_y; ++y) {
- for (x=0; x < dim_x; ++x) {
+ npy_intp &x = coordinates[1];
+ npy_intp &y = coordinates[0];
+ npy_intp ndim_x = static_cast<npy_intp>(dim_x);
+ npy_intp ndim_y = static_cast<npy_intp>(dim_y);
+ for (y=0; y < ndim_y; ++y) {
+ for (x=0; x < ndim_x; ++x) {
PyArray_ITER_GOTO(iter, coordinates);
PyObject* dataObj = PyArray_GETITEM(array, iter->dataptr);
const object py_data = object( handle<>( dataObj ) );
- buffer[y*dim_x + x] = extract<TangoScalarType>(py_data);
+ buffer[y*ndim_x + x] = extract<TangoScalarType>(py_data);
}
}
} else {
diff --git a/src/boost/cpp/device_data.cpp b/src/boost/cpp/device_data.cpp
index 4d0a0bb..42eef88 100644
--- a/src/boost/cpp/device_data.cpp
+++ b/src/boost/cpp/device_data.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "pytgutils.h"
@@ -45,9 +33,9 @@ namespace PyDeviceData {
void insert_scalar(Tango::DeviceData &self, object py_value)
{
typedef typename TANGO_const2type(tangoTypeConst) TangoScalarType;
- TangoScalarType val;
- val = boost::python::extract<TangoScalarType>(py_value);
- self << val;
+ TangoScalarType value;
+ from_py<tangoTypeConst>::convert(py_value.ptr(), value);
+ self << value;
}
template <>
void insert_scalar<Tango::DEV_ENCODED>(Tango::DeviceData &self, object py_value)
@@ -146,6 +134,7 @@ namespace PyDeviceData {
return to_py_numpy<tangoArrayTypeConst>(tmp_ptr, py_self);
# endif
case PyTango::ExtractAsList:
+ case PyTango::ExtractAsPyTango3:
return to_py_list(tmp_ptr);
case PyTango::ExtractAsTuple:
return to_py_tuple(tmp_ptr);
diff --git a/src/boost/cpp/device_data_history.cpp b/src/boost/cpp/device_data_history.cpp
index 85e9828..cf37f29 100644
--- a/src/boost/cpp/device_data_history.cpp
+++ b/src/boost/cpp/device_data_history.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/device_info.cpp b/src/boost/cpp/device_info.cpp
index 2d62892..d2fd32f 100644
--- a/src/boost/cpp/device_info.cpp
+++ b/src/boost/cpp/device_info.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/device_proxy.cpp b/src/boost/cpp/device_proxy.cpp
index ab94662..f99838c 100644
--- a/src/boost/cpp/device_proxy.cpp
+++ b/src/boost/cpp/device_proxy.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "device_attribute.h"
@@ -424,10 +412,10 @@ void export_device_proxy()
.def("get_device_db", &Tango::DeviceProxy::get_device_db,
bopy::return_value_policy<bopy::reference_existing_object>())
- .def("status", &PyDeviceProxy::status,
+ .def("_status", &PyDeviceProxy::status,
( arg_("self") ) )
- .def("state", &PyDeviceProxy::state,
+ .def("_state", &PyDeviceProxy::state,
( arg_("self") ) )
.def("adm_name", &Tango::DeviceProxy::adm_name,
@@ -442,7 +430,10 @@ void export_device_proxy()
.def("alias", &Tango::DeviceProxy::alias,
( arg_("self") ) )
- .def("ping", &PyDeviceProxy::ping,
+ .def("get_tango_lib_version", &Tango::DeviceProxy::get_tango_lib_version,
+ ( arg_("self") ) )
+
+ .def("_ping", &PyDeviceProxy::ping,
( arg_("self") ) )
@@ -550,21 +541,21 @@ void export_device_proxy()
&PyDeviceProxy::read_attribute,
( arg_("self"), arg_("attr_name"), arg_("extract_as")=PyTango::ExtractAsNumpy ) )
- .def("read_attributes",
+ .def("_read_attributes",
&PyDeviceProxy::read_attributes,
( arg_("self"), arg_("attr_names"), arg_("extract_as")=PyTango::ExtractAsNumpy ) )
- .def("write_attribute",
+ .def("_write_attribute",
(void (*)(Tango::DeviceProxy&, const string &, bopy::object ))
&PyDeviceProxy::write_attribute,
( arg_("self"), arg_("attr_name"), arg_("value") ) )
- .def("write_attribute",
+ .def("_write_attribute",
(void (*)(Tango::DeviceProxy&, const Tango::AttributeInfo &, bopy::object ))
&PyDeviceProxy::write_attribute,
( arg_("self"), arg_("attr_info"), arg_("value") ) )
- .def("write_attributes",
+ .def("_write_attributes",
&PyDeviceProxy::write_attributes,
( arg_("self"), arg_("name_val") ) )
diff --git a/src/boost/cpp/enums.cpp b/src/boost/cpp/enums.cpp
index a82832f..4f4fa53 100644
--- a/src/boost/cpp/enums.cpp
+++ b/src/boost/cpp/enums.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/event_data.cpp b/src/boost/cpp/event_data.cpp
index 834f815..a9f7f49 100644
--- a/src/boost/cpp/event_data.cpp
+++ b/src/boost/cpp/event_data.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/exception.cpp b/src/boost/cpp/exception.cpp
index ab86894..f6852c7 100644
--- a/src/boost/cpp/exception.cpp
+++ b/src/boost/cpp/exception.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "pytgutils.h"
diff --git a/src/boost/cpp/exception.h b/src/boost/cpp/exception.h
index c2073b3..3fadbd1 100644
--- a/src/boost/cpp/exception.h
+++ b/src/boost/cpp/exception.h
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#pragma once
diff --git a/src/boost/cpp/fast_from_py.h b/src/boost/cpp/fast_from_py.h
index 6f4a1bb..4329aae 100644
--- a/src/boost/cpp/fast_from_py.h
+++ b/src/boost/cpp/fast_from_py.h
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#pragma once
@@ -103,6 +91,7 @@ struct from_py<tangoTypeConst> \
{ \
cpy_type cpy_value = FN(o); \
if(PyErr_Occurred()) { \
+ PyErr_Clear(); \
PyErr_SetString(PyExc_TypeError, "Expecting a numeric type, it is not."); \
boost::python::throw_error_already_set(); \
} \
@@ -135,18 +124,20 @@ struct from_py<tangoTypeConst> \
{ \
cpy_type cpy_value = FN(o); \
if(PyErr_Occurred()) { \
+ PyErr_Clear(); \
if(PyArray_CheckScalar(o) && \
( PyArray_DescrFromScalar(o) \
== PyArray_DescrFromType(TANGO_const2numpy(tangoTypeConst)))) \
{ \
PyArray_ScalarAsCtype(o, reinterpret_cast<void*>(&tg)); \
return; \
- } else \
+ } else { \
PyErr_SetString(PyExc_TypeError, "Expecting a numeric type," \
" but it is not. If you use a numpy type instead of" \
" python core types, then it must exactly match (ex:" \
" numpy.int32 for PyTango.DevLong)"); \
boost::python::throw_error_already_set(); \
+ } \
} \
if (TangoScalarTypeLimits::is_integer) { \
if (cpy_value > (cpy_type)TangoScalarTypeLimits::max()) { \
@@ -163,6 +154,20 @@ struct from_py<tangoTypeConst> \
};
#endif // !DISABLE_PYTANGO_NUMPY
+
+/* Allow for downcast */
+
+inline unsigned PY_LONG_LONG PyLong_AsUnsignedLongLong_2(PyObject *pylong)
+{
+ unsigned PY_LONG_LONG result = PyLong_AsUnsignedLongLong(pylong);
+ if(PyErr_Occurred())
+ {
+ PyErr_Clear();
+ result = PyLong_AsUnsignedLong(pylong);
+ }
+ return result;
+}
+
DEFINE_FAST_TANGO_FROMPY_NUM(Tango::DEV_BOOLEAN, long, PyLong_AsLong)
DEFINE_FAST_TANGO_FROMPY_NUM(Tango::DEV_UCHAR, unsigned long, PyLong_AsUnsignedLong)
DEFINE_FAST_TANGO_FROMPY_NUM(Tango::DEV_SHORT, long, PyLong_AsLong)
@@ -172,7 +177,7 @@ DEFINE_FAST_TANGO_FROMPY_NUM(Tango::DEV_ULONG, unsigned long, PyLong_AsUnsignedL
DEFINE_FAST_TANGO_FROMPY(Tango::DEV_STATE, PyLong_AsLong)
DEFINE_FAST_TANGO_FROMPY_NUM(Tango::DEV_LONG64, Tango::DevLong64, PyLong_AsLongLong)
-DEFINE_FAST_TANGO_FROMPY_NUM(Tango::DEV_ULONG64, Tango::DevULong64, PyLong_AsUnsignedLongLong)
+DEFINE_FAST_TANGO_FROMPY_NUM(Tango::DEV_ULONG64, Tango::DevULong64, PyLong_AsUnsignedLongLong_2)
DEFINE_FAST_TANGO_FROMPY_NUM(Tango::DEV_FLOAT, double, PyFloat_AsDouble)
DEFINE_FAST_TANGO_FROMPY_NUM(Tango::DEV_DOUBLE, double, PyFloat_AsDouble)
@@ -202,6 +207,7 @@ struct array_element_from_py<Tango::DEVVAR_CHARARRAY>
{
long cpy_value = PyLong_AsLong(o);
if(PyErr_Occurred()) {
+ PyErr_Clear();
PyErr_SetString(PyExc_TypeError, "Expecting a numeric type,"
" but it is not");
boost::python::throw_error_already_set();
@@ -223,6 +229,7 @@ struct array_element_from_py<Tango::DEVVAR_CHARARRAY>
{
long cpy_value = PyLong_AsLong(o);
if(PyErr_Occurred()) {
+ PyErr_Clear();
if(PyArray_CheckScalar(o) &&
( PyArray_DescrFromScalar(o)
== PyArray_DescrFromType(TANGO_const2scalarnumpy(tangoArrayTypeConst))))
diff --git a/src/boost/cpp/fast_from_py_numpy.hpp b/src/boost/cpp/fast_from_py_numpy.hpp
index cd2e5ae..6fd6cb8 100644
--- a/src/boost/cpp/fast_from_py_numpy.hpp
+++ b/src/boost/cpp/fast_from_py_numpy.hpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
// This header file is just some template functions moved apart from
// attribute.cpp, and should only be included there.
diff --git a/src/boost/cpp/from_py.cpp b/src/boost/cpp/from_py.cpp
index 6c91a6f..0ec3c8d 100644
--- a/src/boost/cpp/from_py.cpp
+++ b/src/boost/cpp/from_py.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "from_py.h"
diff --git a/src/boost/cpp/from_py.h b/src/boost/cpp/from_py.h
index 90a0093..f03bd6b 100644
--- a/src/boost/cpp/from_py.h
+++ b/src/boost/cpp/from_py.h
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#pragma once
diff --git a/src/boost/cpp/group.cpp b/src/boost/cpp/group.cpp
index bbf0cdf..67ab686 100644
--- a/src/boost/cpp/group.cpp
+++ b/src/boost/cpp/group.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "pytgutils.h"
diff --git a/src/boost/cpp/group_reply.cpp b/src/boost/cpp/group_reply.cpp
index 49d6684..4685fe5 100644
--- a/src/boost/cpp/group_reply.cpp
+++ b/src/boost/cpp/group_reply.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "pytgutils.h"
diff --git a/src/boost/cpp/group_reply_list.cpp b/src/boost/cpp/group_reply_list.cpp
index 63d2da5..6b80999 100644
--- a/src/boost/cpp/group_reply_list.cpp
+++ b/src/boost/cpp/group_reply_list.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "pytgutils.h"
diff --git a/src/boost/cpp/locker_info.cpp b/src/boost/cpp/locker_info.cpp
index 1315bda..3509cab 100644
--- a/src/boost/cpp/locker_info.cpp
+++ b/src/boost/cpp/locker_info.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/locking_thread.cpp b/src/boost/cpp/locking_thread.cpp
index aced19b..8ef8c9c 100644
--- a/src/boost/cpp/locking_thread.cpp
+++ b/src/boost/cpp/locking_thread.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/periodic_event_info.cpp b/src/boost/cpp/periodic_event_info.cpp
index 15b4c69..a44cccb 100644
--- a/src/boost/cpp/periodic_event_info.cpp
+++ b/src/boost/cpp/periodic_event_info.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
@@ -29,6 +17,7 @@ using namespace boost::python;
void export_periodic_event_info()
{
class_<Tango::PeriodicEventInfo>("PeriodicEventInfo")
+ .enable_pickling()
.def_readwrite("period", &Tango::PeriodicEventInfo::period)
.def_readwrite("extensions", &Tango::PeriodicEventInfo::extensions)
;
diff --git a/src/boost/cpp/poll_device.cpp b/src/boost/cpp/poll_device.cpp
index 8c96fa2..f878670 100644
--- a/src/boost/cpp/poll_device.cpp
+++ b/src/boost/cpp/poll_device.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/precompiled_header.cpp b/src/boost/cpp/precompiled_header.cpp
index dfb1220..1b7634d 100644
--- a/src/boost/cpp/precompiled_header.cpp
+++ b/src/boost/cpp/precompiled_header.cpp
@@ -1,24 +1,12 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
\ No newline at end of file
diff --git a/src/boost/cpp/precompiled_header.hpp b/src/boost/cpp/precompiled_header.hpp
index 854742f..b484add 100644
--- a/src/boost/cpp/precompiled_header.hpp
+++ b/src/boost/cpp/precompiled_header.hpp
@@ -1,31 +1,20 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
// These files are really basic, used everywere within the project
// but they take a while (seconds!) to process.
// We don't want to waste those seconds for each cpp file, so we
// use this precompiled header.
+//#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include <boost/python.hpp>
#include <boost/version.hpp>
diff --git a/src/boost/cpp/pytango.cpp b/src/boost/cpp/pytango.cpp
index ad80c1d..967b0cf 100644
--- a/src/boost/cpp/pytango.cpp
+++ b/src/boost/cpp/pytango.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
diff --git a/src/boost/cpp/pytgutils.cpp b/src/boost/cpp/pytgutils.cpp
index 66910eb..cb9b553 100644
--- a/src/boost/cpp/pytgutils.cpp
+++ b/src/boost/cpp/pytgutils.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "defs.h"
diff --git a/src/boost/cpp/pytgutils.h b/src/boost/cpp/pytgutils.h
index 896df23..75b7cbe 100644
--- a/src/boost/cpp/pytgutils.h
+++ b/src/boost/cpp/pytgutils.h
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#pragma once
diff --git a/src/boost/cpp/pyutils.cpp b/src/boost/cpp/pyutils.cpp
index d112e53..3fd6baf 100644
--- a/src/boost/cpp/pyutils.cpp
+++ b/src/boost/cpp/pyutils.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "defs.h"
diff --git a/src/boost/cpp/pyutils.h b/src/boost/cpp/pyutils.h
index 21e090f..23295dd 100644
--- a/src/boost/cpp/pyutils.h
+++ b/src/boost/cpp/pyutils.h
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#pragma once
diff --git a/src/boost/cpp/server/attr.cpp b/src/boost/cpp/server/attr.cpp
index 8a68e34..0933262 100644
--- a/src/boost/cpp/server/attr.cpp
+++ b/src/boost/cpp/server/attr.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "server/attr.h"
diff --git a/src/boost/cpp/server/attr.h b/src/boost/cpp/server/attr.h
index 92a52bb..ab3f6c8 100644
--- a/src/boost/cpp/server/attr.h
+++ b/src/boost/cpp/server/attr.h
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#ifndef _ATTR_H_
#define _ATTR_H_
diff --git a/src/boost/cpp/server/attribute.cpp b/src/boost/cpp/server/attribute.cpp
index e74eb86..0e88137 100644
--- a/src/boost/cpp/server/attribute.cpp
+++ b/src/boost/cpp/server/attribute.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "defs.h"
@@ -94,7 +82,7 @@ namespace PyAttribute
*/
unique_pointer<TangoScalarType> cpp_val(new TangoScalarType);
- from_py<tangoTypeConst>::convert(value, *cpp_val);
+ from_py<tangoTypeConst>::convert(value.ptr(), *cpp_val);
att.set_value(cpp_val.release(), 1, 0, true);
}
diff --git a/src/boost/cpp/server/attribute.h b/src/boost/cpp/server/attribute.h
index 24e3bce..7c9ef38 100644
--- a/src/boost/cpp/server/attribute.h
+++ b/src/boost/cpp/server/attribute.h
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#ifndef _ATTRIBUTE_H_
#define _ATTRIBUTE_H_
diff --git a/src/boost/cpp/server/command.cpp b/src/boost/cpp/server/command.cpp
index 94845d2..99e8134 100644
--- a/src/boost/cpp/server/command.cpp
+++ b/src/boost/cpp/server/command.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "exception.h"
diff --git a/src/boost/cpp/server/command.h b/src/boost/cpp/server/command.h
index e92a590..1630c5f 100644
--- a/src/boost/cpp/server/command.h
+++ b/src/boost/cpp/server/command.h
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#ifndef _COMMAND_H_
#define _COMMAND_H_
diff --git a/src/boost/cpp/server/device_class.cpp b/src/boost/cpp/server/device_class.cpp
index d5b8033..63e4324 100644
--- a/src/boost/cpp/server/device_class.cpp
+++ b/src/boost/cpp/server/device_class.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "pytgutils.h"
diff --git a/src/boost/cpp/server/device_class.h b/src/boost/cpp/server/device_class.h
index c03a473..8f9ea43 100644
--- a/src/boost/cpp/server/device_class.h
+++ b/src/boost/cpp/server/device_class.h
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#ifndef _DEVICE_CLASS_H_
#define _DEVICE_CLASS_H_
diff --git a/src/boost/cpp/server/device_impl.cpp b/src/boost/cpp/server/device_impl.cpp
index 16bd950..a5472e7 100644
--- a/src/boost/cpp/server/device_impl.cpp
+++ b/src/boost/cpp/server/device_impl.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "defs.h"
@@ -595,27 +583,42 @@ namespace PyDeviceImpl
inline void debug(Tango::DeviceImpl &self, const string &msg)
{
- self.get_logger()->debug(msg);
+ if (self.get_logger()->is_debug_enabled()) {
+ self.get_logger()->debug_stream()
+ << log4tango::LogInitiator::_begin_log << msg;
+ }
}
inline void info(Tango::DeviceImpl &self, const string &msg)
{
- self.get_logger()->info(msg);
+ if (self.get_logger()->is_info_enabled()) {
+ self.get_logger()->info_stream()
+ << log4tango::LogInitiator::_begin_log << msg;
+ }
}
inline void warn(Tango::DeviceImpl &self, const string &msg)
{
- self.get_logger()->warn(msg);
+ if (self.get_logger()->is_warn_enabled()) {
+ self.get_logger()->warn_stream()
+ << log4tango::LogInitiator::_begin_log << msg;
+ }
}
inline void error(Tango::DeviceImpl &self, const string &msg)
{
- self.get_logger()->error(msg);
+ if (self.get_logger()->is_error_enabled()) {
+ self.get_logger()->error_stream()
+ << log4tango::LogInitiator::_begin_log << msg;
+ }
}
inline void fatal(Tango::DeviceImpl &self, const string &msg)
{
- self.get_logger()->fatal(msg);
+ if (self.get_logger()->is_fatal_enabled()) {
+ self.get_logger()->fatal_stream()
+ << log4tango::LogInitiator::_begin_log << msg;
+ }
}
PyObject* get_attribute_config(Tango::DeviceImpl &self, object &py_attr_name_seq)
diff --git a/src/boost/cpp/server/device_impl.h b/src/boost/cpp/server/device_impl.h
index 6ac340d..b998d80 100644
--- a/src/boost/cpp/server/device_impl.h
+++ b/src/boost/cpp/server/device_impl.h
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#ifndef _DEVICE_IMPL_H
#define _DEVICE_IMPL_H
diff --git a/src/boost/cpp/server/dserver.cpp b/src/boost/cpp/server/dserver.cpp
index d8ed68a..904ba61 100644
--- a/src/boost/cpp/server/dserver.cpp
+++ b/src/boost/cpp/server/dserver.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
@@ -139,6 +127,12 @@ namespace PyDServer
delete ret;
return py_ret;
}
+
+ void duplicate_d_var(Tango::DServer &self)
+ {
+ Tango::Device_var d = self._this();
+ self.set_d_var(Tango::Device::_duplicate(d));
+ }
}
BOOST_PYTHON_FUNCTION_OVERLOADS(add_obj_polling_overload, PyDServer::add_obj_polling, 2, 4)
@@ -198,6 +192,7 @@ void export_dserver()
.def("get_poll_th_pool_size", &Tango::DServer::get_poll_th_pool_size)
.def("get_opt_pool_usage", &Tango::DServer::get_opt_pool_usage)
.def("get_poll_th_conf", &Tango::DServer::get_poll_th_conf)
+ .def("duplicate_d_var", &PyDServer::duplicate_d_var)
;
}
diff --git a/src/boost/cpp/server/encoded_attribute.cpp b/src/boost/cpp/server/encoded_attribute.cpp
index bafa5d0..8bbbc36 100644
--- a/src/boost/cpp/server/encoded_attribute.cpp
+++ b/src/boost/cpp/server/encoded_attribute.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
@@ -844,6 +832,7 @@ namespace PyEncodedAttribute
delete [] buffer;
break;
}
+ case PyTango::ExtractAsPyTango3:
case PyTango::ExtractAsList:
{
ret = PyList_New(height);
@@ -981,6 +970,7 @@ namespace PyEncodedAttribute
delete [] buffer;
break;
}
+ case PyTango::ExtractAsPyTango3:
case PyTango::ExtractAsList:
{
ret = PyList_New(height);
@@ -1138,6 +1128,7 @@ namespace PyEncodedAttribute
delete [] buffer;
break;
}
+ case PyTango::ExtractAsPyTango3:
case PyTango::ExtractAsList:
{
ret = PyList_New(height);
diff --git a/src/boost/cpp/server/log4tango.cpp b/src/boost/cpp/server/log4tango.cpp
index eb29b87..d724ab0 100644
--- a/src/boost/cpp/server/log4tango.cpp
+++ b/src/boost/cpp/server/log4tango.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "defs.h"
diff --git a/src/boost/cpp/server/multi_attribute.cpp b/src/boost/cpp/server/multi_attribute.cpp
index b3d5216..6d2f249 100644
--- a/src/boost/cpp/server/multi_attribute.cpp
+++ b/src/boost/cpp/server/multi_attribute.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/server/multi_class_attribute.cpp b/src/boost/cpp/server/multi_class_attribute.cpp
index 218363d..7dc2f31 100644
--- a/src/boost/cpp/server/multi_class_attribute.cpp
+++ b/src/boost/cpp/server/multi_class_attribute.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "pytgutils.h"
diff --git a/src/boost/cpp/server/subdev.cpp b/src/boost/cpp/server/subdev.cpp
index 6fdec99..e72e4bc 100644
--- a/src/boost/cpp/server/subdev.cpp
+++ b/src/boost/cpp/server/subdev.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/server/tango_util.cpp b/src/boost/cpp/server/tango_util.cpp
index 506ad42..d6594af 100644
--- a/src/boost/cpp/server/tango_util.cpp
+++ b/src/boost/cpp/server/tango_util.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "defs.h"
@@ -177,7 +165,7 @@ namespace PyUtil
boost::python::object& py_event_loop)
{
PYTANGO_MOD
- if (py_event_loop.is_none())
+ if (py_event_loop.ptr() == Py_None)
{
self.server_set_event_loop(NULL);
pytango.attr("_server_event_loop") = py_event_loop;
@@ -188,6 +176,32 @@ namespace PyUtil
self.server_set_event_loop(event_loop);
}
}
+
+ void set_use_db(bool use_db)
+ {
+ Tango::Util::_UseDb = use_db;
+ }
+
+ boost::python::str get_dserver_ior(Tango::Util& self, Tango::DServer* dserver)
+ {
+ const char *ior = self.get_orb()->object_to_string(dserver->_this());
+ boost::python::str ret = ior;
+ delete [] ior;
+ return ret;
+ }
+
+ boost::python::str get_device_ior(Tango::Util& self, Tango::DeviceImpl* device)
+ {
+ const char *ior = self.get_orb()->object_to_string(device->get_d_var());
+ boost::python::str ret = ior;
+ delete [] ior;
+ return ret;
+ }
+
+ void orb_run(Tango::Util& self)
+ {
+ self.get_orb()->run();
+ }
}
void init_python()
@@ -202,6 +216,11 @@ BOOST_PYTHON_FUNCTION_OVERLOADS (server_init_overload, PyUtil::server_init, 1, 2
void export_util()
{
+ class_<Tango::Interceptors>("Interceptors")
+ .def("create_thread", &Tango::Interceptors::create_thread)
+ .def("delete_thread", &Tango::Interceptors::delete_thread)
+ ;
+
class_<Tango::Util, boost::noncopyable>("_Util", no_init)
.def("init", PyUtil::init,
return_value_policy<reference_existing_object>())
@@ -259,9 +278,15 @@ void export_util()
.def("get_device_by_name", &PyUtil::get_device_by_name)
.def("get_device_list", &PyUtil::get_device_list)
.def("server_set_event_loop", &PyUtil::server_set_event_loop)
+ .def("set_interceptors", &Tango::Util::set_interceptors)
.def_readonly("_UseDb", &Tango::Util::_UseDb)
.def_readonly("_FileDb", &Tango::Util::_FileDb)
.def("init_python", init_python)
.staticmethod("init_python")
+ .def("set_use_db", &PyUtil::set_use_db)
+ .staticmethod("set_use_db")
+ .def("get_dserver_ior", &PyUtil::get_dserver_ior)
+ .def("get_device_ior", &PyUtil::get_device_ior)
+ .def("orb_run", &PyUtil::orb_run)
;
}
diff --git a/src/boost/cpp/server/user_default_attr_prop.cpp b/src/boost/cpp/server/user_default_attr_prop.cpp
index b0b49ef..6c8aabd 100644
--- a/src/boost/cpp/server/user_default_attr_prop.cpp
+++ b/src/boost/cpp/server/user_default_attr_prop.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/server/wattribute.cpp b/src/boost/cpp/server/wattribute.cpp
index e12f4be..5d63198 100644
--- a/src/boost/cpp/server/wattribute.cpp
+++ b/src/boost/cpp/server/wattribute.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "defs.h"
@@ -243,13 +231,16 @@ namespace PyWAttribute
boost::python::object &value)
{
typedef typename TANGO_const2type(tangoTypeConst) TangoScalarType;
- extract<TangoScalarType> val(value.ptr());
+ /*extract<TangoScalarType> val(value.ptr());
if (!val.check())
{
throw_wrong_python_data_type(att.get_name(), "set_write_value()");
}
- TangoScalarType cpp_val = val;
- att.set_write_value(cpp_val);
+ TangoScalarType cpp_value = val;
+ */
+ TangoScalarType cpp_value;
+ from_py<tangoTypeConst>::convert(value.ptr(), cpp_value);
+ att.set_write_value(cpp_value);
}
template<>
@@ -436,6 +427,50 @@ namespace PyWAttribute
/// @name get_write_value
/// @{
+ //
+ // PyTango 3 compatibility
+ //
+
+ template<long tangoTypeConst>
+ void __get_write_value_pytango3(Tango::WAttribute &att, boost::python::list &seq)
+ {
+ typedef typename TANGO_const2type(tangoTypeConst) TangoScalarType;
+
+ const TangoScalarType *ptr;
+
+ long length = att.get_write_value_length();
+
+ att.get_write_value(ptr);
+
+ for (long l = 0; l < length; ++l)
+ {
+ seq.append(ptr[l]);
+ }
+ }
+
+ template<>
+ void __get_write_value_pytango3<Tango::DEV_STRING>(Tango::WAttribute &att,
+ boost::python::list &seq)
+ {
+ const Tango::ConstDevString *ptr;
+
+ long length = att.get_write_value_length();
+
+ att.get_write_value(ptr);
+
+ for (long l = 0; l < length; ++l)
+ {
+ seq.append(ptr[l]);
+ }
+ }
+
+ inline void get_write_value_pytango3(Tango::WAttribute &att,
+ boost::python::list &value)
+ {
+ long type = att.get_data_type();
+ TANGO_CALL_ON_ATTRIBUTE_DATA_TYPE_ID(type, __get_write_value_pytango3, att, value);
+ }
+
template<long tangoTypeConst>
void __get_write_value_scalar(Tango::WAttribute &att, boost::python::object* obj)
{
@@ -455,6 +490,32 @@ namespace PyWAttribute
}
template<long tangoTypeConst>
+ void __get_write_value_array_pytango3(Tango::WAttribute &att, boost::python::object* obj)
+ {
+ typedef typename TANGO_const2type(tangoTypeConst) TangoScalarType;
+
+ const TangoScalarType * buffer;
+ att.get_write_value(buffer);
+ size_t length = att.get_write_value_length();
+
+ boost::python::list o;
+ for (size_t n = 0; n < length; ++n)
+ o.append(buffer[n]);
+ *obj = o;
+ }
+
+ template<>
+ void __get_write_value_array_pytango3<Tango::DEV_STRING>(Tango::WAttribute &att, boost::python::object* obj)
+ {
+ const Tango::ConstDevString *ptr;
+ long length = att.get_write_value_length();
+ att.get_write_value(ptr);
+ boost::python::list o;
+ for (long l = 0; l < length; ++l)
+ o.append(ptr[l]);
+ }
+
+ template<long tangoTypeConst>
void __get_write_value_array_lists(Tango::WAttribute &att, boost::python::object* obj)
{
typedef typename TANGO_const2type(tangoTypeConst) TangoScalarType;
@@ -534,6 +595,11 @@ namespace PyWAttribute
TANGO_CALL_ON_ATTRIBUTE_DATA_TYPE_ID(type, __get_write_value_scalar, att, &value);
} else {
switch (extract_as) {
+ case PyTango::ExtractAsPyTango3: {
+ TANGO_CALL_ON_ATTRIBUTE_DATA_TYPE_ID(type,
+ __get_write_value_array_pytango3, att, &value);
+ break;
+ }
case PyTango::ExtractAsNumpy: {
# ifndef DISABLE_PYTANGO_NUMPY
TANGO_CALL_ON_ATTRIBUTE_DATA_TYPE_ID(type,
@@ -587,6 +653,13 @@ void export_wattribute()
.def("set_write_value",
(void (*) (Tango::WAttribute &, boost::python::object &, long, long))
&PyWAttribute::set_write_value)
+
+ // old style get_write_value
+ .def("get_write_value",
+ &PyWAttribute::get_write_value_pytango3,
+ ( arg_("self"), arg_("empty_list")))
+
+ // new style get_write_value
.def("get_write_value",
&PyWAttribute::get_write_value,
( arg_("self"), arg_("extract_as")=PyTango::ExtractAsNumpy ))
diff --git a/src/boost/cpp/server/wattribute_numpy.hpp b/src/boost/cpp/server/wattribute_numpy.hpp
index 4ff7d1c..d5c8b11 100644
--- a/src/boost/cpp/server/wattribute_numpy.hpp
+++ b/src/boost/cpp/server/wattribute_numpy.hpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
// This header file is just some template functions moved apart from
// wattribute.cpp, and should only be included there.
diff --git a/src/boost/cpp/tango_numpy.h b/src/boost/cpp/tango_numpy.h
index 0d90ebd..56f29e5 100644
--- a/src/boost/cpp/tango_numpy.h
+++ b/src/boost/cpp/tango_numpy.h
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#pragma once
diff --git a/src/boost/cpp/tgutils.h b/src/boost/cpp/tgutils.h
index 88cd837..a06d2a3 100644
--- a/src/boost/cpp/tgutils.h
+++ b/src/boost/cpp/tgutils.h
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#pragma once
diff --git a/src/boost/cpp/time_val.cpp b/src/boost/cpp/time_val.cpp
index 7bca3a8..93f6be1 100644
--- a/src/boost/cpp/time_val.cpp
+++ b/src/boost/cpp/time_val.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/cpp/to_py.cpp b/src/boost/cpp/to_py.cpp
index c093e52..3c2600d 100644
--- a/src/boost/cpp/to_py.cpp
+++ b/src/boost/cpp/to_py.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include "defs.h"
diff --git a/src/boost/cpp/to_py.h b/src/boost/cpp/to_py.h
index c394c26..691779c 100644
--- a/src/boost/cpp/to_py.h
+++ b/src/boost/cpp/to_py.h
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#pragma once
diff --git a/src/boost/cpp/to_py_numpy.hpp b/src/boost/cpp/to_py_numpy.hpp
index eeac9a9..2574d76 100644
--- a/src/boost/cpp/to_py_numpy.hpp
+++ b/src/boost/cpp/to_py_numpy.hpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#pragma once
diff --git a/src/boost/cpp/version.cpp b/src/boost/cpp/version.cpp
index 005d5b6..cfa950e 100644
--- a/src/boost/cpp/version.cpp
+++ b/src/boost/cpp/version.cpp
@@ -1,25 +1,13 @@
-/*******************************************************************************
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
- This file is part of PyTango, a python binding for Tango
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
#include "precompiled_header.hpp"
#include <tango.h>
diff --git a/src/boost/python/__init__.py b/src/boost/python/__init__.py
index 4dfcee8..38a9163 100644
--- a/src/boost/python/__init__.py
+++ b/src/boost/python/__init__.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is the main PyTango package file.
@@ -43,8 +31,8 @@ __all__ = [ 'AccessControlType', 'ApiUtil', 'ArchiveEventInfo',
'CommunicationFailed', 'Connection', 'ConnectionFailed',
'ConstDevString', 'DServer', 'DataReadyEventData', 'Database', 'DbData',
'DbDatum', 'DbDevExportInfo', 'DbDevExportInfos', 'DbDevImportInfo',
-'DbDevImportInfos', 'DbDevInfo', 'DbDevInfos', 'DbHistory',
-'DbHistoryList', 'DbServerInfo', 'DebugIt', 'DevBoolean', 'DevCommandInfo',
+'DbDevImportInfos', 'DbDevFullInfo', 'DbDevInfo', 'DbDevInfos', 'DbHistory',
+'DbHistoryList', 'DbServerInfo', 'DbServerData', 'DebugIt', 'DevBoolean', 'DevCommandInfo',
'DevDouble', 'DevEncoded', 'DevError', 'DevFailed', 'DevFloat', 'DevInt',
'DevLong', 'DevLong64', 'DevShort', 'DevSource', 'DevState', 'DevString',
'DevUChar', 'DevULong', 'DevULong64', 'DevUShort', 'DevVarBooleanArray',
@@ -130,8 +118,8 @@ from ._PyTango import (AccessControlType, ApiUtil, ArchiveEventInfo,
CmdDoneEvent, CommandInfo, CommandInfoList, CommunicationFailed,
Connection, ConnectionFailed, ConstDevString, DServer, DataReadyEventData,
Database, DbData, DbDatum, DbDevExportInfo, DbDevExportInfos,
- DbDevImportInfo, DbDevImportInfos, DbDevInfo, DbDevInfos, DbHistory,
- DbHistoryList, DbServerInfo, DevBoolean, DevCommandInfo, DevDouble,
+ DbDevImportInfo, DbDevImportInfos, DbDevFullInfo, DbDevInfo, DbDevInfos, DbHistory,
+ DbHistoryList, DbServerInfo, DbServerData, DevBoolean, DevCommandInfo, DevDouble,
DevEncoded, DevError, DevFailed, DevFloat, DevInt, DevLong, DevLong64,
DevShort, DevSource, DevState, DevString, DevUChar, DevULong, DevULong64,
DevUShort, DevVarBooleanArray, DevVarCharArray, DevVarDoubleArray,
@@ -143,7 +131,7 @@ from ._PyTango import (AccessControlType, ApiUtil, ArchiveEventInfo,
DeviceImpl, DeviceInfo, DeviceUnlocked, Device_2Impl,
Device_3Impl, Device_4Impl, DispLevel, EncodedAttribute, ErrSeverity,
EventData, EventSystemFailed, EventType,
- Except, ExtractAs, FMT_UNKNOWN, GroupAttrReply, GroupAttrReplyList,
+ Except, ExtractAs, GreenMode, FMT_UNKNOWN, GroupAttrReply, GroupAttrReplyList,
GroupCmdReply, GroupCmdReplyList, GroupReply, GroupReplyList,
IMAGE, ImageAttr, KeepAliveCmdCode, Level, LockCmdCode, LockerInfo,
LockerLanguage, LogLevel, LogTarget, Logger, Logging, MessBoxType,
@@ -156,7 +144,7 @@ from ._PyTango import (AccessControlType, ApiUtil, ArchiveEventInfo,
StdNamedDevFailedVector, StdStringVector, SubDevDiag, TimeVal,
UserDefaultAttrProp, WAttribute, WRITE, WrongData, WrongNameSyntax,
alarm_flags, asyn_req_type, cb_sub_model, constants,
- raise_asynch_exception)
+ raise_asynch_exception, Interceptors)
ArgType = CmdArgType
@@ -176,7 +164,7 @@ from .log4tango import TangoStream, LogIt, DebugIt, InfoIt, WarnIt, \
from .device_server import ChangeEventProp, PeriodicEventProp, \
ArchiveEventProp, AttributeAlarm, EventProperties, AttributeConfig, \
AttributeConfig_2, AttributeConfig_3, MultiAttrProp
-from .attribute_proxy import AttributeProxy
+from .attribute_proxy import AttributeProxy, get_attribute_proxy
from .group import Group
from .pyutil import Util
from .device_class import DeviceClass
@@ -185,7 +173,8 @@ from .globals import get_class, get_classes, get_cpp_class, get_cpp_classes, \
delete_class_list, class_list, cpp_class_list, constructed_class
from .utils import is_scalar_type, is_array_type, is_numerical_type, \
is_int_type, is_float_type, obj_2_str, seqStr_2_obj
-from .utils import server_run
+from .green import set_green_mode, get_green_mode
+from .device_proxy import get_device_proxy
from .tango_numpy import NumpyType, numpy_type, numpy_spectrum, numpy_image
from .pytango_init import init as __init
diff --git a/src/boost/python/api2.py b/src/boost/python/api2.py
deleted file mode 100644
index 3a0672d..0000000
--- a/src/boost/python/api2.py
+++ /dev/null
@@ -1,605 +0,0 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
-
-""".. _pytango-api2:
-
-This module provides a high level device server API. It implements
-:ref:`TEP1 <pytango-TEP1>`. It exposes an easier API for developing a tango
-device server.
-
-Here is the summary of features which this module exposes and are not available
-on the low level :mod:`PyTango` server API:
-
-#. Automatic inheritance from the latest :class:`~PyTango.DeviceImpl`
-#. default implementation of :meth:`Device.__init__`
- calls :meth:`Device.init_device`. Around 90% of the
- different device classes which inherit from low level
- :class:`~PyTango.DeviceImpl` only implement `__init__` to call their
- `init_device`
-#. has a default implementation of :meth:`Device.init_device`
- which calls :meth:`Device.get_device_properties`. Again,
- 90% of existing device classes do that
-#. Automatically creates a hidden :class:`~PyTango.DeviceClass` class
-#. recognizes :func:`attribute` members and automatically
- registers them as tango attributes in the hidden
- :class:`~PyTango.DeviceClass`
-#. recognizes :class:`command` decorated functions and
- automatically registers them as tango commands in the hidden
- :class:`~PyTango.DeviceClass`
-#. recognizes :func:`device_property` members and
- automatically registers them as tango device properties in the hidden
- :class:`~PyTango.DeviceClass`
-#. recognizes :func:`class_property` members and
- automatically registers them as tango class properties in the hidden
- :class:`~PyTango.DeviceClass`
-#. read and write attribute methods don't need :class:`~PyTango.Attribute`
- parameter. Access to :class:`~PyTango.Attribute` object is with simple::
-
- self.<attr name>
-
-#. read attribute methods can set attribute return value with::
-
- def read_voltage(self):
- return value
-
- # or
-
- def read_voltage(self):
- self.voltage = value
-
- instead of::
-
- def read_voltage(self, attr):
- attr.set_value(value)
-
-:class:`Device` works very well in conjuction with:
-
-#. :meth:`attribute`
-#. :class:`command`
-#. :meth:`device_property`
-#. :meth:`class_property`
-#. :meth:`~PyTango.server_run`
-
-Here is an example of a PowerSupply device with:
-
-#. a read-only double scalar `voltage` attribute
-#. a read/write double scalar `current` attribute
-#. a `ramp` command
-#. a `host` device property
-
-.. code-block:: python
- :linenos:
-
- from time import time
-
- from PyTango import AttrQuality, DebugIt, server_run
- from PyTango.api2 import Device, DeviceMeta
- from PyTango.api2 import attribute, command, device_property
-
- class PowerSupply(Device):
- __metaclass__ = DeviceMeta
-
- voltage = attribute()
-
- current = attribute(label="Current", unit="A",
- fread="read_current",
- fwrite="write_current")
-
- host = device_property()
-
- def read_voltage(self):
- return 10.0
-
- def read_current(self):
- return 2.5, time(), AttrQuality.ON
-
- @DebugIt()
- def write_current(self):
- new_current = self.current.get_write_value()
-
- @command()
- def ramp(self):
- self.info_stream("Ramping on " + self.host + "...")
-
- def main():
- classes = PowerSupply,
- server_run(classes)
-
- if __name__ == "__main__":
- main()
-
-And here is the equivalent code using the low-level API:
-
-.. code-block:: python
- :linenos:
-
- import sys
- import time
-
- import PyTango
-
- class PowerSupply(PyTango.Device_4Impl):
-
- def __init__(self, devclass, name):
- PyTango.Device_4Impl.__init__(self, devclass, name)
- self.init_device()
-
- def init_device(self):
- self.get_device_properties()
-
- def read_voltage(self, attr):
- attr.set_value(10.0)
-
- def read_current(self):
- attr.set_value_date_quality(2.5, time.time(), PyTango.AttrQuality.ON)
-
- @PyTango.DebugIt()
- def write_current(self, attr):
- new_current = attr.get_write_value()
-
- def ramp(self):
- self.info_stream("Ramping on " + self.host + "...")
-
-
- class PowerSupplyClass(PyTango.DeviceClass):
-
- class_property_list = {}
-
- device_property_list = {
- 'host':
- [PyTango.DevString, "host of power supply", "localhost"],
- }
-
- cmd_list = {
- 'ramp':
- [ [PyTango.DevVoid, "nothing"],
- [PyTango.DevVoid, "nothing"] ],
- }
-
- attr_list = {
- 'voltage':
- [[PyTango.DevDouble,
- PyTango.SCALAR,
- PyTango.READ]],
- 'current':
- [[PyTango.DevDouble,
- PyTango.SCALAR,
- PyTango.READ_WRITE],
- { 'label' : 'Current', 'unit' : 'A' }],
- }
-
-
- def main():
- try:
- py = PyTango.Util(sys.argv)
- py.add_class(PowerSupplyClass,PowerSupply,'PowerSupply')
-
- U = PyTango.Util.instance()
- U.server_init()
- U.server_run()
-
- except PyTango.DevFailed,e:
- print '-------> Received a DevFailed exception:',e
- except Exception,e:
- print '-------> An unforeseen exception occured....',e
-
- if __name__ == "__main__":
- main()
-
-
-*Pretty cool, uh?*
-"""
-
-from __future__ import with_statement
-from __future__ import print_function
-
-__all__ = ["DeviceMeta", "Device", "LatestDeviceImpl", "attribute", "command",
- "device_property", "class_property"]
-
-import functools
-import __builtin__
-
-from ._PyTango import DeviceImpl, Attribute, WAttribute, CmdArgType, \
- AttrDataFormat, AttrWriteType, DispLevel, constants
-from .attr_data import AttrData
-from .device_class import DeviceClass
-from .utils import get_tango_device_classes, is_non_str_seq, is_pure_str
-from .log4tango import DebugIt
-
-API_VERSION = 2
-
-LatestDeviceImpl = get_tango_device_classes()[-1]
-
-def __build_to_tango_type():
- ret = \
- {
- int : CmdArgType.DevLong,
- str : CmdArgType.DevString,
- bool : CmdArgType.DevBoolean,
- bytearray : CmdArgType.DevEncoded,
- float : CmdArgType.DevDouble,
- chr : CmdArgType.DevUChar,
- None : CmdArgType.DevVoid,
-
- 'int' : CmdArgType.DevLong,
- 'int16' : CmdArgType.DevShort,
- 'int32' : CmdArgType.DevLong,
- 'int64' : CmdArgType.DevLong64,
- 'uint' : CmdArgType.DevULong,
- 'uint16' : CmdArgType.DevUShort,
- 'uint32' : CmdArgType.DevULong,
- 'uint64' : CmdArgType.DevULong64,
- 'str' : CmdArgType.DevString,
- 'string' : CmdArgType.DevString,
- 'text' : CmdArgType.DevString,
- 'bool' : CmdArgType.DevBoolean,
- 'boolean' : CmdArgType.DevBoolean,
- 'bytes' : CmdArgType.DevEncoded,
- 'bytearray' : CmdArgType.DevEncoded,
- 'float' : CmdArgType.DevDouble,
- 'float32' : CmdArgType.DevFloat,
- 'float64' : CmdArgType.DevDouble,
- 'double' : CmdArgType.DevDouble,
- 'byte' : CmdArgType.DevUChar,
- 'chr' : CmdArgType.DevUChar,
- 'char' : CmdArgType.DevUChar,
- 'None' : CmdArgType.DevVoid,
- }
-
- for key in dir(CmdArgType):
- if key.startswith("Dev"):
- value = getattr(CmdArgType, key)
- ret[key] = ret[value] = value
-
- if constants.NUMPY_SUPPORT:
- import numpy
- FROM_TANGO_TO_NUMPY_TYPE = { \
- CmdArgType.DevBoolean : numpy.bool8,
- CmdArgType.DevUChar : numpy.ubyte,
- CmdArgType.DevShort : numpy.short,
- CmdArgType.DevUShort : numpy.ushort,
- CmdArgType.DevLong : numpy.int32,
- CmdArgType.DevULong : numpy.uint32,
- CmdArgType.DevLong64 : numpy.int64,
- CmdArgType.DevULong64 : numpy.uint64,
- CmdArgType.DevString : numpy.str,
- CmdArgType.DevDouble : numpy.float64,
- CmdArgType.DevFloat : numpy.float32,
- }
-
- for key,value in FROM_TANGO_TO_NUMPY_TYPE.items():
- ret[value] = key
-
- head = "{0:40} {0:40}\n".format(40*"=")
- doc = "{0} {1:38} {2:38} \n{0}".format(head,'type','tango type')
- keys = sorted(ret)
- for key in keys:
- value = ret[key]
- if type(key) == type:
- key_name = key.__name__
- if key_name in __builtin__.__dict__:
- key = ":py:obj:`{0}`".format(key_name)
- elif key.__module__ == 'numpy':
- key = ":py:obj:`numpy.{0}`".format(key_name)
- else:
- key = "``{0}``".format(key_name)
- elif is_pure_str(key):
- key = "``'{0}'``".format(key)
- else:
- key = "``{0}``".format(key)
- value = "``{0}``".format(value)
- doc += " {0:38} {1:38} \n".format(key, str(value))
- doc += head
- return ret, doc
-
-TO_TANGO_TYPE, __type_doc = __build_to_tango_type()
-
-
-
-def get_tango_type(dtype):
- return TO_TANGO_TYPE[dtype]
-
-get_tango_type.__doc__ = __type_doc
-
-def set_complex_value(attr, value):
- is_tuple = isinstance(value, tuple)
- dtype, fmt = attr.get_data_type(), attr.get_data_format()
- if dtype == CmdArgType.DevEncoded:
- if is_tuple and len(value) == 4:
- attr.set_value_date_quality(*value)
- elif is_tuple and len(value) == 3 and is_non_str_seq(value[0]):
- attr.set_value_date_quality(value[0][0], value[0][1], *value[1:])
- else:
- attr.set_value(*value)
- else:
- if is_tuple:
- if len(value) == 3:
- if fmt == AttrDataFormat.SCALAR:
- attr.set_value_date_quality(*value)
- elif fmt == AttrDataFormat.SPECTRUM:
- if is_seq(value[0]):
- attr.set_value_date_quality(*value)
- else:
- attr.set_value(value)
- else:
- if is_seq(value[0]) and is_seq(value[0][0]):
- attr.set_value_date_quality(*value)
- else:
- attr.set_value(value)
- else:
- attr.set_value(value)
- else:
- attr.set_value(value)
-
-def check_tango_device_klass_attribute_read_method(tango_device_klass, method_name):
- """Checks if method given by it's name for the given DeviceImpl class has
- the correct signature. If a read/write method doesn't have a parameter
- (the traditional Attribute), then the method is wrapped into another method
- which has correct parameter definition to make it work.
-
- :param tango_device_klass: a DeviceImpl class
- :type tango_device_klass: class
- :param method_name: method to be cheched
- :type attr_data: str"""
- read_method = getattr(tango_device_klass, method_name)
-
- @functools.wraps(read_method)
- def read_attr(self, attr):
- ret = read_method(self)
- if not attr.get_value_flag() and ret is not None:
- set_complex_value(attr, ret)
- return ret
- setattr(tango_device_klass, method_name, read_attr)
-
-def check_tango_device_klass_attribute_write_method(tango_device_klass, method_name):
- """Checks if method given by it's name for the given DeviceImpl class has
- the correct signature. If a read/write method doesn't have a parameter
- (the traditional Attribute), then the method is wrapped into another method
- which has correct parameter definition to make it work.
-
- :param tango_device_klass: a DeviceImpl class
- :type tango_device_klass: class
- :param method_name: method to be cheched
- :type attr_data: str"""
- write_method = real_f_obj = getattr(tango_device_klass, method_name)
-
- @functools.wraps(write_method)
- def write_attr(self, attr):
- value = attr.get_write_value()
- return write_method(self, value)
- setattr(tango_device_klass, method_name, write_attr)
-
-def check_tango_device_klass_attribute_methods(tango_device_klass, attr_data):
- """Checks if the read and write methods have the correct signature. If a
- read/write method doesn't have a parameter (the traditional Attribute),
- then the method is wrapped into another method to make this work
-
- :param tango_device_klass: a DeviceImpl class
- :type tango_device_klass: class
- :param attr_data: the attribute data information
- :type attr_data: AttrData"""
- if attr_data.attr_write in (AttrWriteType.READ, AttrWriteType.READ_WRITE):
- check_tango_device_klass_attribute_read_method(tango_device_klass, attr_data.read_method_name)
- if attr_data.attr_write in (AttrWriteType.WRITE, AttrWriteType.READ_WRITE):
- check_tango_device_klass_attribute_write_method(tango_device_klass, attr_data.write_method_name)
-
-def create_tango_deviceclass_klass(tango_device_klass, attrs=None):
- klass_name = tango_device_klass.__name__
- if not issubclass(tango_device_klass, (Device)):
- raise Exception("{0} device must inherit from PyTango.api2.Device".format(klass_name))
-
- if attrs is None:
- attrs = tango_device_klass.__dict__
-
- attr_list = {}
- for attr_name, attr_obj in attrs.items():
- if isinstance(attr_obj, AttrData2):
- attr_obj._set_name(attr_name)
- attr_list[attr_name] = attr_obj
- check_tango_device_klass_attribute_methods(tango_device_klass, attr_obj)
-
- class_property_list = {}
- device_property_list = {}
- cmd_list = {}
- devclass_name = klass_name + "Class"
-
- def device_class_constructor(self, name):
- DeviceClass.__init__(self, name)
- self.set_type(name)
-
- devclass_attrs = dict(class_property_list=class_property_list,
- device_property_list=device_property_list,
- cmd_list=cmd_list, attr_list=attr_list)
- devclass_attrs['__init__'] = device_class_constructor
- return type(devclass_name, (DeviceClass,), devclass_attrs)
-
-def init_tango_device_klass(tango_device_klass, attrs=None, tango_class_name=None):
- klass_name = tango_device_klass.__name__
- tango_deviceclass_klass = create_tango_deviceclass_klass(tango_device_klass,
- attrs=attrs)
- if tango_class_name is None:
- tango_klass_name = klass_name
- tango_device_klass._DeviceClass = tango_deviceclass_klass
- tango_device_klass._DeviceClassName = tango_klass_name
- tango_device_klass._api = API_VERSION
- return tango_device_klass
-
-def create_tango_device_klass(name, bases, attrs):
- klass_name = name
-
- LatestDeviceImplMeta = type(LatestDeviceImpl)
- klass = LatestDeviceImplMeta(klass_name, bases, attrs)
- init_tango_device_klass(klass, attrs)
- return klass
-
-def DeviceMeta(name, bases, attrs):
- """The :py:data:`metaclass` callable for :class:`Device`. Every subclass of
- :class:`Device` must have associated this metaclass to itself in order to
- work properly (boost-python internal limitation).
-
- Example (python 2.x)::
-
- from PyTango.api2 import Device, DeviceMeta
-
- class PowerSupply(Device):
- __metaclass__ = DeviceMeta
-
- Example (python 3.x)::
-
- from PyTango.api2 import Device, DeviceMeta
-
- class PowerSupply(Device, metaclass=DeviceMeta):
- pass
- """
- return create_tango_device_klass(name, bases, attrs)
-
-
-class Device(LatestDeviceImpl):
- """High level DeviceImpl API.
-
- .. seealso::
-
- Module :py:mod:`PyTango.api2`
- Full API2 documentation"""
-
- def __init__(self, cl, name):
- LatestDeviceImpl.__init__(self, cl, name)
- self.init_device()
-
- def init_device(self):
- """Tango init_device method. Default implementation calls
- :meth:`get_device_properties`"""
- self.get_device_properties()
-
- def always_executed_hook(self):
- """Tango always_executed_hook. Default implementation does nothing"""
- pass
-
-
-class AttrData2(AttrData):
- """High level AttrData. To be used """
-
- def get_attribute(self, obj):
- return obj.get_device_attr().get_attr_by_name(self.attr_name)
-
- def __get__(self, obj, objtype):
- return self.get_attribute(obj)
-
- def __set__(self, obj, value):
- attr = self.get_attribute(obj)
- set_complex_value(attr, value)
-
- def __delete__(self, obj):
- obj.remove_attribute(self.attr_name)
-
-def attribute(**kwargs):
- if 'dtype' in kwargs:
- kwargs['dtype'] = get_tango_type(kwargs['dtype'])
- return AttrData2.from_dict(kwargs)
-
-
-attribute.__doc__ = """\
-declares a new tango attribute in a :class:`Device`. To be used like the python
-native :obj:`property` function. For exampke, to declare a scalar,
-`PyTango.DevDouble`, read-only attribute called *voltage* in a *PowerSupply*
-:class:`Device` do::
-
- class PowerSupply(Device):
-
- voltage = attribute()
-
- def read_voltage(self):
- self.voltage = 1.0
-
-It receives multiple keyword arguments.
-
-===================== ========================================== ============================================== =======================================================================================
-parameter type default value description
-===================== ========================================== ============================================== =======================================================================================
-name :obj:`str` class member name alternative attribute name
-dtype :obj:`object` :obj:`~PyTango.CmdArgType`\ ``.DevDouble`` data type (see :ref:`Data type equivalence <pytango-api2-datatypes>`)
-dformat :obj:`~PyTango.AttrDataFormat` :obj:`~PyTango.AttrDataFormat`\ ``.SCALAR`` data format
-max_dim_x :obj:`int` 1 maximum size for x dimension (ignored for SCALAR format)
-max_dim_y :obj:`int` 0 maximum size for y dimension (ignored for SCALAR and SPECTRUM formats)
-display_level :obj:`~PyTango.DispLevel` :obj:`~PyTango.DisLevel`\ ``.OPERATOR`` display level
-polling_period :obj:`int` -1 polling period
-memorized :obj:`bool` False attribute should or not be memorized
-hw_memorized :obj:`bool` False write method should be called at startup when restoring memorize value (dangerous!)
-param access :obj:`~PyTango.AttrWriteType` :obj:`~PyTango.AttrWriteType`\ ``.READ`` read only/ read write / write only access
-fread :obj:`str` or :obj:`callable` 'read_<attr_name>' read method name or method object
-fwrite :obj:`str` or :obj:`callable` 'write_<attr_name>' write method name or method object
-is_allowed :obj:`str` or :obj:`callable` 'is_<attr_name>_allowed' is allowed method name or method object
-label :obj:`str` '<attr_name>' attribute label
-description :obj:`str` '' attribute description
-unit :obj:`str` '' physical units the attribute value is in
-standard_unit :obj:`str` '' physical standard unit
-display_unit :obj:`str` '' physical display unit (hint for clients)
-format :obj:`str` '6.2f' attribute representation format
-min_value :obj:`str` None minimum allowed value
-max_value :obj:`str` None maximum allowed value
-min_alarm :obj:`str` None minimum value to trigger attribute alarm
-max_alarm :obj:`str` None maximum value to trigger attribute alarm
-min_warning :obj:`str` None minimum value to trigger attribute warning
-max_warning :obj:`str` None maximum value to trigger attribute warning
-delta_val :obj:`str` None
-delta_t :obj:`str` None
-abs_change :obj:`str` None minimum value change between events that causes event filter to send the event
-rel_change :obj:`str` None minimum relative change between events that causes event filter to send the event (%)
-period :obj:`str` None
-archive_abs_change :obj:`str` None
-archive_rel_change :obj:`str` None
-archive_period :obj:`str` None
-===================== ========================================== ============================================== =======================================================================================
-
-.. _pytango-api2-datatypes:
-
-The `dtype` parameter in :func:`attribute` is not retricted to the :obj:`~PyTango.CmdArgType options.
-For example, to define a :obj:`~PyTango.CmdArgType`\ ``.DevLong`` attribute you
-have several possibilities:
-
- #. :obj:`int`
- #. 'int'
- #. 'int32'
- #. 'integer'
- #. :obj:`~PyTango.CmdArgType`\ ``.DevLong``
- #. 'DevLong'
- #. :obj:`numpy.int32`
-
-Below is the complete table of equivalences.
-
-.. rubric:: Data type equivalence
-
-""" + __type_doc
-
-class command:
- """TODO"""
- pass
-
-def device_property():
- """TODO"""
- pass
-
-def class_property():
- """TODO"""
- pass
-
diff --git a/src/boost/python/api_util.py b/src/boost/python/api_util.py
index 6d5594c..1184555 100644
--- a/src/boost/python/api_util.py
+++ b/src/boost/python/api_util.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
diff --git a/src/boost/python/attr_data.py b/src/boost/python/attr_data.py
index 5467a45..c75c6d6 100644
--- a/src/boost/python/attr_data.py
+++ b/src/boost/python/attr_data.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
@@ -34,8 +22,9 @@ __docformat__ = "restructuredtext"
import inspect
-from ._PyTango import Except, CmdArgType, AttrDataFormat, AttrWriteType, \
- DispLevel, UserDefaultAttrProp, Attr, SpectrumAttr, ImageAttr
+from ._PyTango import Except, CmdArgType, AttrDataFormat, AttrWriteType
+from ._PyTango import DispLevel, UserDefaultAttrProp
+from ._PyTango import Attr, SpectrumAttr, ImageAttr
from .utils import is_non_str_seq, is_pure_str
@@ -75,6 +64,10 @@ class AttrData(object):
name = attr_dict.pop('name', None)
class_name = attr_dict.pop('class_name', None)
self = cls(name, class_name)
+ self.build_from_dict(attr_dict)
+ return self
+
+ def build_from_dict(self, attr_dict):
self.attr_type = attr_dict.pop('dtype', CmdArgType.DevDouble)
self.attr_format = attr_dict.pop('dformat', AttrDataFormat.SCALAR)
self.dim_x = attr_dict.pop('max_dim_x', 1)
@@ -89,7 +82,8 @@ class AttrData(object):
self.attr_write = attr_dict.pop('access')
else:
# access is defined by which methods were defined
- r_explicit, w_explicit = "fread" in attr_dict, "fwrite" in attr_dict
+ r_explicit = "fread" in attr_dict or "fget" in attr_dict
+ w_explicit = "fwrite" in attr_dict or "fset" in attr_dict
if r_explicit and w_explicit:
self.attr_write = AttrWriteType.READ_WRITE
elif r_explicit:
@@ -99,13 +93,13 @@ class AttrData(object):
else:
self.attr_write = AttrWriteType.READ
- fread = attr_dict.pop('fread', None)
+ fread = attr_dict.pop('fget', attr_dict.pop('fread', None))
if fread is not None:
if is_pure_str(fread):
self.read_method_name = fread
elif inspect.isroutine(fread):
self.read_method_name = fread.__name__
- fwrite = attr_dict.pop('fwrite', None)
+ fwrite = attr_dict.pop('fset', attr_dict.pop('fwrite', None))
if fwrite is not None:
if is_pure_str(fwrite):
self.write_method_name = fwrite
@@ -124,7 +118,7 @@ class AttrData(object):
if not self.attr_format == AttrDataFormat.SPECTRUM:
self.attr_args.append(self.dim_y)
if len(attr_dict):
- self.att_prop = self.__create_user_default_attr_prop(self.attr_name, attr_dict)
+ self.att_prop = self.__create_user_default_attr_prop(attr_dict)
return self
def _set_name(self, name):
@@ -142,9 +136,14 @@ class AttrData(object):
def __throw_exception(self, msg, meth="create_attribute()"):
Except.throw_exception("PyDs_WrongAttributeDefinition", msg, meth)
- def __create_user_default_attr_prop(self, attr_name, extra_info):
+ def __create_user_default_attr_prop(self, extra_info):
"""for internal usage only"""
p = UserDefaultAttrProp()
+
+ doc = extra_info.pop('doc', None)
+ if 'doc' is not None:
+ extra_info['description'] = doc
+
for k, v in extra_info.items():
k_lower = k.lower()
method_name = "set_%s" % k_lower.replace(' ','_')
@@ -249,7 +248,7 @@ class AttrData(object):
self.dim_y = int(attr_info[4])
except:
throw_ex("Wrong data type in attribute argument for attribute "
- "%s in class %s\n5th element in sequence describing "
+ "%s in class %s\n5th element in sequence desribing "
"mandatory dim_y attribute parameter for image "
"attribute must be an integer" % (attr_name, name))
@@ -276,10 +275,11 @@ class AttrData(object):
"attribute %s in class %s\nAttribute information for "
"polling period is not an integer" % (attr_name, name))
- self.memorized = extra_info.get("memorized", "false")
- if self.memorized == "true":
- self.memorized, self.hw_memorized = True, True
- elif self.memorized == "true_without_hard_applied":
+ memorized = extra_info.get("memorized", "false").lower()
+ if memorized == "true":
+ self.memorized = True
+ self.hw_memorized = True
+ elif memorized == "true_without_hard_applied":
self.memorized = True
else:
self.memorized = False
@@ -293,7 +293,7 @@ class AttrData(object):
att_prop = None
if extra_info:
- att_prop = self.__create_user_default_attr_prop(attr_name, extra_info)
+ att_prop = self.__create_user_default_attr_prop(extra_info)
self.att_prop = att_prop
def to_attr(self):
diff --git a/src/boost/python/attribute_proxy.py b/src/boost/python/attribute_proxy.py
index 66fd972..f8461f9 100644
--- a/src/boost/python/attribute_proxy.py
+++ b/src/boost/python/attribute_proxy.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module. It completes the binding of
@@ -29,17 +17,78 @@ To access these members use directly :mod:`PyTango` module and NOT
PyTango.attribute_proxy.
"""
-__all__ = [ "AttributeProxy", "attribute_proxy_init"]
+__all__ = [ "AttributeProxy", "attribute_proxy_init", "get_attribute_proxy" ]
__docformat__ = "restructuredtext"
+import collections
+
from ._PyTango import StdStringVector, DbData, DbDatum, DeviceProxy
from ._PyTango import __AttributeProxy as _AttributeProxy
-from .utils import seq_2_StdStringVector, seq_2_DbData, DbData_2_dict, \
- is_pure_str, is_non_str_seq
-import collections
+from .utils import seq_2_StdStringVector, seq_2_DbData, DbData_2_dict
+from .utils import is_pure_str, is_non_str_seq
+from .green import result, submit, get_green_mode
+def get_attribute_proxy(*args, **kwargs):
+ """
+ get_attribute_proxy(self, full_attr_name, green_mode=None, wait=True, timeout=True) -> AttributeProxy
+ get_attribute_proxy(self, device_proxy, attr_name, green_mode=None, wait=True, timeout=True) -> AttributeProxy
+
+ Returns a new :class:`~PyTango.AttributeProxy`.
+ There is no difference between using this function and the direct
+ :class:`~PyTango.AttributeProxy` constructor if you use the default kwargs.
+
+ The added value of this function becomes evident when you choose a green_mode
+ to be *Futures* or *Gevent*. The AttributeProxy constructor internally makes some
+ network calls which makes it *slow*. By using one of the *green modes* as
+ green_mode you are allowing other python code to be executed in a cooperative way.
+
+ :param full_attr_name: the full name of the attribute
+ :type full_attr_name: str
+ :param device_proxy: the :class:`~PyTango.DeviceProxy`
+ :type device_proxy: DeviceProxy
+ :param attr_name: attribute name for the given device proxy
+ :type attr_name: str
+ :param green_mode: determines the mode of execution of the device (including
+ the way it is created). Defaults to the current global
+ green_mode (check :func:`~PyTango.get_green_mode` and
+ :func:`~PyTango.set_green_mode`)
+ :type green_mode: :obj:`~PyTango.GreenMode`
+ :param wait: whether or not to wait for result. If green_mode
+ Ignored when green_mode is Synchronous (always waits).
+ :type wait: bool
+ :param timeout: The number of seconds to wait for the result.
+ If None, then there is no limit on the wait time.
+ Ignored when green_mode is Synchronous or wait is False.
+ :type timeout: float
+ :returns:
+ if green_mode is Synchronous or wait is True:
+ :class:`~PyTango.AttributeProxy`
+ else if green_mode is Futures:
+ :class:`concurrent.futures.Future`
+ else if green_mode is Gevent:
+ :class:`gevent.event.AsynchResult`
+ :throws:
+ * a *DevFailed* if green_mode is Synchronous or wait is True
+ and there is an error creating the attribute.
+ * a *concurrent.futures.TimeoutError* if green_mode is Futures,
+ wait is False, timeout is not None and the time to create the attribute
+ has expired.
+ * a *gevent.timeout.Timeout* if green_mode is Gevent, wait is False,
+ timeout is not None and the time to create the attribute has expired.
+
+ New in PyTango 8.1.0
+ """
+ # we cannot use the green wrapper because it consumes the green_mode and we
+ # want to forward it to the DeviceProxy constructor
+ green_mode = kwargs.get('green_mode', get_green_mode())
+ wait = kwargs.pop('wait', True)
+ timeout = kwargs.pop('timeout', None)
+
+ d = submit(green_mode, AttributeProxy, *args, **kwargs)
+ return result(d, green_mode, wait=wait, timeout=timeout)
+
def __AttributeProxy__get_property(self, propname, value=None):
"""
get_property(self, propname, value) -> DbData
@@ -128,7 +177,7 @@ def __AttributeProxy__put_property(self, value):
Return : None
Throws : ConnectionFailed, CommunicationFailed
- DevFailed from device (DB_SQLError)
+ DevFailed from device (DB_SQLError)
"""
if isinstance(value, DbData):
pass
@@ -239,10 +288,12 @@ class AttributeProxy(object):
python reimplementation of the AttributeProxy found on the C++ API.
"""
def __init__(self, *args, **kwds):
+ green_mode = kwds.pop('green_mode', get_green_mode())
self.__attr_proxy = _AttributeProxy(*args, **kwds)
# get_device_proxy() returns a different python object each time
# we don't want a different object, so we save the current one.
- self.__dev_proxy = self.__attr_proxy.get_device_proxy()
+ self.__dev_proxy = dp = self.__attr_proxy.get_device_proxy()
+ dp.set_green_mode(green_mode)
def get_device_proxy(self):
"""
diff --git a/src/boost/python/base_types.py b/src/boost/python/base_types.py
index 6e25eb9..d49cc20 100644
--- a/src/boost/python/base_types.py
+++ b/src/boost/python/base_types.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
@@ -39,10 +27,11 @@ from ._PyTango import (StdStringVector, StdLongVector, StdDoubleVector, \
AttributeDimension, AttributeEventInfo, DeviceAttributeConfig, \
AttributeInfo, AttributeInfoEx, ChangeEventInfo, PeriodicEventInfo, \
DevCommandInfo, CommandInfo, DataReadyEventData, DeviceInfo, \
- LockerInfo, PollDevice, TimeVal)
+ LockerInfo, PollDevice, TimeVal, AttrWriteType, AttrDataFormat, DispLevel)
from .utils import document_method, is_integer
from .utils import document_enum as __document_enum
+from .utils import seq_2_StdStringVector, StdStringVector_2_seq
def __StdVector__add(self, seq):
ret = seq.__class__(self)
@@ -85,7 +74,184 @@ def __fillVectorClass(klass):
klass.__imul__ = __StdVector__imul
klass.__original_getitem = klass.__getitem__
klass.__getitem__ = __StdVector__getitem
-
+
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+# DeviceAttributeConfig pickle
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+
+def __DeviceAttributeConfig__getinitargs__(self):
+ return ()
+
+def __DeviceAttributeConfig__getstate__(self):
+ ret = self.name, \
+ int(self.writable), \
+ int(self.data_format), \
+ self.data_type, \
+ self.max_dim_x, \
+ self.max_dim_y, \
+ self.description, \
+ self.label, \
+ self.unit, \
+ self.standard_unit, \
+ self.display_unit, \
+ self.format, \
+ self.min_value, \
+ self.max_value, \
+ self.min_alarm, \
+ self.max_alarm, \
+ self.writable_attr_name, \
+ StdStringVector_2_seq(self.extensions)
+ return ret
+
+def __DeviceAttributeConfig__setstate__(self, state):
+ self.name = state[0]
+ self.writable = AttrWriteType(state[1])
+ self.data_format = AttrDataFormat(state[2])
+ self.data_type = state[3]
+ self.max_dim_x = state[4]
+ self.max_dim_y = state[5]
+ self.description = state[6]
+ self.label = state[7]
+ self.unit = state[8]
+ self.standard_unit = state[9]
+ self.display_unit = state[10]
+ self.format = state[11]
+ self.min_value = state[12]
+ self.max_value = state[13]
+ self.min_alarm = state[14]
+ self.max_alarm = state[15]
+ self.writable_attr_name = state[16]
+ self.extensions = seq_2_StdStringVector(state[17])
+
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+# AttributeInfo pickle
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+
+def __AttributeInfo__getinitargs__(self):
+ return ()
+
+def __AttributeInfo__getstate__(self):
+ ret = list(__DeviceAttributeConfig__getstate__(self))
+ ret.append(int(self.disp_level))
+ return tuple(ret)
+
+def __AttributeInfo__setstate__(self, state):
+ __DeviceAttributeConfig__setstate__(self, state)
+ self.disp_level = DispLevel(state[18])
+
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+# AttributeAlarmInfo pickle
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+
+def __AttributeAlarmInfo__getinitargs__(self):
+ return ()
+
+def __AttributeAlarmInfo__getstate__(self):
+ return self.min_alarm, \
+ self.max_alarm, \
+ self.min_warning, \
+ self.max_warning, \
+ self.delta_t, \
+ self.delta_val, \
+ StdStringVector_2_seq(self.extensions)
+
+def __AttributeAlarmInfo__setstate__(self, state):
+ self.min_alarm = state[0]
+ self.max_alarm = state[1]
+ self.min_warning = state[2]
+ self.max_warning = state[3]
+ self.delta_t = state[4]
+ self.delta_val = state[5]
+ self.extensions = seq_2_StdStringVector(state[6])
+
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+# ChangeEventInfo pickle
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+
+def __ChangeEventInfo__getinitargs__(self):
+ return ()
+
+def __ChangeEventInfo__getstate__(self):
+ return self.rel_change, \
+ self.abs_change, \
+ StdStringVector_2_seq(self.extensions)
+
+def __ChangeEventInfo__setstate__(self, state):
+ self.rel_change = state[0]
+ self.abs_change = state[1]
+ self.extensions = seq_2_StdStringVector(state[2])
+
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+# PeriodicEventInfo pickle
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+
+def __PeriodicEventInfo__getinitargs__(self):
+ return ()
+
+def __PeriodicEventInfo__getstate__(self):
+ return self.period, \
+ StdStringVector_2_seq(self.extensions)
+
+def __PeriodicEventInfo__setstate__(self, state):
+ self.period = state[0]
+ self.extensions = seq_2_StdStringVector(state[1])
+
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+# ArchiveEventInfo pickle
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+
+def __ArchiveEventInfo__getinitargs__(self):
+ return ()
+
+def __ArchiveEventInfo__getstate__(self):
+ return self.archive_rel_change, \
+ self.archive_abs_change, \
+ self.archive_period, \
+ StdStringVector_2_seq(self.extensions)
+
+def __ArchiveEventInfo__setstate__(self, state):
+ self.archive_rel_change = state[0]
+ self.archive_abs_change = state[1]
+ self.archive_period = state[2]
+ self.extensions = seq_2_StdStringVector(state[3])
+
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+# AttributeEventInfo pickle
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+
+def __AttributeEventInfo__getinitargs__(self):
+ return ()
+
+def __AttributeEventInfo__getstate__(self):
+ return self.ch_event, \
+ self.per_event, \
+ self.arch_event
+
+def __AttributeEventInfo__setstate__(self, state):
+ self.ch_event = state[0]
+ self.per_event = state[1]
+ self.arch_event = state[2]
+
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+# AttributeInfoEx pickle
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+
+def __AttributeInfoEx__getinitargs__(self):
+ return ()
+
+def __AttributeInfoEx__getstate__(self):
+ ret = list(__AttributeInfo__getstate__(self))
+ ret.append(self.alarms)
+ ret.append(self.events)
+ ret.append(StdStringVector_2_seq(self.sys_extensions))
+ return tuple(ret)
+
+def __AttributeInfoEx__setstate__(self, state):
+ __AttributeInfo__setstate__(self, state)
+ self.alarms = state[19]
+ self.events = state[20]
+ self.sys_extensions = seq_2_StdStringVector(state[21])
+
def __init_base_types():
v_klasses = (StdStringVector,StdLongVector,StdDoubleVector,CommandInfoList, \
@@ -97,6 +263,39 @@ def __init_base_types():
for v_klass in v_klasses:
__fillVectorClass(v_klass)
+ DeviceAttributeConfig.__getinitargs__ = __DeviceAttributeConfig__getinitargs__
+ DeviceAttributeConfig.__getstate__ = __DeviceAttributeConfig__getstate__
+ DeviceAttributeConfig.__setstate__ = __DeviceAttributeConfig__setstate__
+
+ AttributeInfo.__getinitargs__ = __AttributeInfo__getinitargs__
+ AttributeInfo.__getstate__ = __AttributeInfo__getstate__
+ AttributeInfo.__setstate__ = __AttributeInfo__setstate__
+
+ AttributeAlarmInfo.__getinitargs__ = __AttributeAlarmInfo__getinitargs__
+ AttributeAlarmInfo.__getstate__ = __AttributeAlarmInfo__getstate__
+ AttributeAlarmInfo.__setstate__ = __AttributeAlarmInfo__setstate__
+
+ ChangeEventInfo.__getinitargs__ = __ChangeEventInfo__getinitargs__
+ ChangeEventInfo.__getstate__ = __ChangeEventInfo__getstate__
+ ChangeEventInfo.__setstate__ = __ChangeEventInfo__setstate__
+
+ PeriodicEventInfo.__getinitargs__ = __PeriodicEventInfo__getinitargs__
+ PeriodicEventInfo.__getstate__ = __PeriodicEventInfo__getstate__
+ PeriodicEventInfo.__setstate__ = __PeriodicEventInfo__setstate__
+
+ ArchiveEventInfo.__getinitargs__ = __ArchiveEventInfo__getinitargs__
+ ArchiveEventInfo.__getstate__ = __ArchiveEventInfo__getstate__
+ ArchiveEventInfo.__setstate__ = __ArchiveEventInfo__setstate__
+
+ AttributeEventInfo.__getinitargs__ = __AttributeEventInfo__getinitargs__
+ AttributeEventInfo.__getstate__ = __AttributeEventInfo__getstate__
+ AttributeEventInfo.__setstate__ = __AttributeEventInfo__setstate__
+
+ AttributeInfoEx.__getinitargs__ = __AttributeInfoEx__getinitargs__
+ AttributeInfoEx.__getstate__ = __AttributeInfoEx__getstate__
+ AttributeInfoEx.__setstate__ = __AttributeInfoEx__setstate__
+
+
def __doc_base_types():
def document_enum(enum_name, desc):
@@ -383,6 +582,16 @@ def __doc_base_types():
- OPERATOR
- EXPERT
""" )
+
+ document_enum("GreenMode", """
+ An enumeration representing the GreenMode
+
+ - Synchronous
+ - Futures
+ - Gevent
+
+ New in PyTango 8.1.0
+ """ )
ArchiveEventInfo.__doc__ = """
A structure containing available archiving event information for an attribute
diff --git a/src/boost/python/callback.py b/src/boost/python/callback.py
index 6b78bb4..629e01f 100644
--- a/src/boost/python/callback.py
+++ b/src/boost/python/callback.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
diff --git a/src/boost/python/client.py b/src/boost/python/client.py
new file mode 100644
index 0000000..de55252
--- /dev/null
+++ b/src/boost/python/client.py
@@ -0,0 +1,18 @@
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
+
+"""High Level API for writting Tango clients"""
+
+from PyTango import DeviceProxy as Device
+from PyTango import AttributeProxy as Attribute
+from PyTango import Database
+from PyTango import Group
+from PyTango import DeviceAttribute
diff --git a/src/boost/python/connection.py b/src/boost/python/connection.py
index 0245c0b..a576e3f 100644
--- a/src/boost/python/connection.py
+++ b/src/boost/python/connection.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
@@ -36,6 +24,7 @@ from ._PyTango import Connection, DeviceData, __CallBackAutoDie, CmdArgType, \
DeviceProxy, Database, ExtractAs
from .utils import document_method as __document_method
from .utils import document_static_method as __document_static_method
+from .green import green
def __CallBackAutoDie__cmd_ended_aux(self, fn):
@@ -79,7 +68,7 @@ def __get_command_inout_param(self, cmd_name, cmd_param=None):
def __Connection__command_inout(self, name, *args, **kwds):
"""
- command_inout( self, cmd_name, cmd_param=None) -> any
+ command_inout( self, cmd_name, cmd_param=None, green_mode=None, wait=True, timeout=None) -> any
Execute a command on a device.
@@ -88,9 +77,26 @@ def __Connection__command_inout(self, name, *args, **kwds):
- cmd_param : (any) It should be a value of the type expected by the
command or a DeviceData object with this value inserted.
It can be ommited if the command should not get any argument.
+ - green_mode : (GreenMode) Defaults to the current DeviceProxy GreenMode.
+ (see :meth:`~PyTango.DeviceProxy.get_green_mode` and
+ :meth:`~PyTango.DeviceProxy.set_green_mode`).
+ - wait : (bool) whether or not to wait for result. If green_mode
+ is *Synchronous*, this parameter is ignored as it always
+ waits for the result.
+ Ignored when green_mode is Synchronous (always waits).
+ - timeout : (float) The number of seconds to wait for the result.
+ If None, then there is no limit on the wait time.
+ Ignored when green_mode is Synchronous or wait is False.
Return : The result of the command. The type depends on the command. It may be None.
Throws : ConnectionFailed, CommunicationFailed, DeviceUnlocked, DevFailed from device
+ TimeoutError (green_mode == Futures) If the future didn't finish executing before the given timeout.
+ Timeout (green_mode == Gevent) If the async result didn't finish executing before the given timeout.
+
+ .. versionadded:: 8.1.0
+ *green_mode* parameter.
+ *wait* parameter.
+ *timeout* parameter.
"""
r = Connection.command_inout_raw(self, name, *args, **kwds)
if isinstance(r, DeviceData):
@@ -100,6 +106,7 @@ def __Connection__command_inout(self, name, *args, **kwds):
return None
else:
return r
+__Connection__command_inout.__name__ = "command_inout"
def __Connection__command_inout_raw(self, cmd_name, cmd_param = None):
"""
@@ -198,6 +205,7 @@ def __Connection__command_inout_asynch(self, cmd_name, *args):
return self.__command_inout_asynch_id(cmd_name, argin, forget)
else:
raise TypeError("Wrong number of attributes!")
+__Connection__command_inout_asynch.__name__ = "command_inout_asynch"
def __Connection__command_inout_reply(self, idx, timeout=None):
"""
@@ -244,11 +252,12 @@ def __Connection__command_inout_reply(self, idx, timeout=None):
return None
else:
return r
+__Connection__command_inout_reply.__name__ = "command_inout_reply"
def __init_Connection():
Connection.defaultCommandExtractAs = ExtractAs.Numpy
Connection.command_inout_raw = __Connection__command_inout_raw
- Connection.command_inout = __Connection__command_inout
+ Connection.command_inout = green(__Connection__command_inout)
Connection.command_inout_asynch = __Connection__command_inout_asynch
Connection.command_inout_reply = __Connection__command_inout_reply
diff --git a/src/boost/python/databaseds/database.py b/src/boost/python/databaseds/database.py
index d579778..6092884 100644
--- a/src/boost/python/databaseds/database.py
+++ b/src/boost/python/databaseds/database.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-# -*- coding:utf-8 -*-
+# -*- coding:utf-8 -*-
##############################################################################
@@ -7,7 +7,7 @@
##============================================================================
##
## File : DataBase.py
-##
+##
## Project : TANGO
##
## $Author : controls$
@@ -35,6 +35,26 @@ import sys
# Add additional import
#----- PROTECTED REGION ID(DataBase.additionnal_import) ENABLED START -----#
+import logging
+
+class DbInter(PyTango.Interceptors):
+
+ def create_thread(self):
+ pass
+
+ def delete_thread(self):
+ pass
+
+DB_NAME = None
+
+def set_db_name(db_name):
+ global DB_NAME
+ DB_NAME = db_name
+
+def get_db_name():
+ return DB_NAME
+
+
import db_access
th_exc = PyTango.Except.throw_exception
@@ -49,7 +69,7 @@ DB_FRONTED = {
def check_device_name(dev_name):
if '*' in dev_name:
return False, None, None
-
+
if dev_name.startswith("tango:"):
dev_name = dev_name[6:]
elif dev_name.startswith("taco:"):
@@ -62,7 +82,7 @@ def check_device_name(dev_name):
if len(dfm) != 3:
return False, None, None
# check that each element has at least one character
- if not all(map(len,dfm)):
+ if not all(map(len, dfm)):
return False, None, None
return True, dev_name, dfm
@@ -78,8 +98,8 @@ def replace_wildcard(text):
# replace '*' with '%'
text = text.replace("*", "%")
return text
-
-
+
+
#----- PROTECTED REGION END -----# // DataBase.additionnal_import
##############################################################################
@@ -100,18 +120,18 @@ class DataBase (PyTango.Device_4Impl):
#------------------------------------------------------------------
# Device constructor
#------------------------------------------------------------------
- def __init__(self,cl, name):
- PyTango.Device_4Impl.__init__(self,cl,name)
+ def __init__(self, cl, name):
+ PyTango.Device_4Impl.__init__(self, cl, name)
self.debug_stream("In " + self.get_name() + ".__init__()")
DataBase.init_device(self)
-
+
#------------------------------------------------------------------
# Device destructor
#------------------------------------------------------------------
def delete_device(self):
self.debug_stream("In " + self.get_name() + ".delete_device()")
#----- PROTECTED REGION ID(DataBase.delete_device) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.delete_device
#------------------------------------------------------------------
@@ -119,7 +139,7 @@ class DataBase (PyTango.Device_4Impl):
#------------------------------------------------------------------
def init_device(self):
self.debug_stream("In " + self.get_name() + ".init_device()")
- self.get_device_properties(self.get_device_class())
+ #self.get_device_properties(self.get_device_class())
self.attr_StoredProcedureRelease_read = ''
self.attr_Timing_average_read = [0.0]
self.attr_Timing_minimum_read = [0.0]
@@ -128,10 +148,10 @@ class DataBase (PyTango.Device_4Impl):
self.attr_Timing_index_read = ['']
self.attr_Timing_info_read = ['']
#----- PROTECTED REGION ID(DataBase.init_device) ENABLED START -----#
-
+
self.db = db_access.Tango_sqlite3()
-
-
+
+
#----- PROTECTED REGION END -----# // DataBase.init_device
#------------------------------------------------------------------
@@ -140,7 +160,7 @@ class DataBase (PyTango.Device_4Impl):
def always_executed_hook(self):
self.debug_stream("In " + self.get_name() + ".always_excuted_hook()")
#----- PROTECTED REGION ID(DataBase.always_executed_hook) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.always_executed_hook
#==================================================================
@@ -155,71 +175,69 @@ class DataBase (PyTango.Device_4Impl):
def read_StoredProcedureRelease(self, attr):
self.debug_stream("In " + self.get_name() + ".read_StoredProcedureRelease()")
#----- PROTECTED REGION ID(DataBase.StoredProcedureRelease_read) ENABLED START -----#
- self.attr_StoredProcedureRelease_read = db.get_stored_procedure_release()
+ self.attr_StoredProcedureRelease_read = self.db.get_stored_procedure_release()
#----- PROTECTED REGION END -----# // DataBase.StoredProcedureRelease_read
attr.set_value(self.attr_StoredProcedureRelease_read)
-
+
#------------------------------------------------------------------
# Read Timing_average attribute
#------------------------------------------------------------------
def read_Timing_average(self, attr):
self.debug_stream("In " + self.get_name() + ".read_Timing_average()")
#----- PROTECTED REGION ID(DataBase.Timing_average_read) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.Timing_average_read
attr.set_value(self.attr_Timing_average_read)
-
+
#------------------------------------------------------------------
# Read Timing_minimum attribute
#------------------------------------------------------------------
def read_Timing_minimum(self, attr):
self.debug_stream("In " + self.get_name() + ".read_Timing_minimum()")
#----- PROTECTED REGION ID(DataBase.Timing_minimum_read) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.Timing_minimum_read
attr.set_value(self.attr_Timing_minimum_read)
-
+
#------------------------------------------------------------------
# Read Timing_maximum attribute
#------------------------------------------------------------------
def read_Timing_maximum(self, attr):
self.debug_stream("In " + self.get_name() + ".read_Timing_maximum()")
#----- PROTECTED REGION ID(DataBase.Timing_maximum_read) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.Timing_maximum_read
attr.set_value(self.attr_Timing_maximum_read)
-
+
#------------------------------------------------------------------
# Read Timing_calls attribute
#------------------------------------------------------------------
def read_Timing_calls(self, attr):
self.debug_stream("In " + self.get_name() + ".read_Timing_calls()")
#----- PROTECTED REGION ID(DataBase.Timing_calls_read) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.Timing_calls_read
attr.set_value(self.attr_Timing_calls_read)
-
+
#------------------------------------------------------------------
# Read Timing_index attribute
#------------------------------------------------------------------
def read_Timing_index(self, attr):
self.debug_stream("In " + self.get_name() + ".read_Timing_index()")
#----- PROTECTED REGION ID(DataBase.Timing_index_read) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.Timing_index_read
attr.set_value(self.attr_Timing_index_read)
-
+
#------------------------------------------------------------------
# Read Timing_info attribute
#------------------------------------------------------------------
def read_Timing_info(self, attr):
self.debug_stream("In " + self.get_name() + ".read_Timing_info()")
#----- PROTECTED REGION ID(DataBase.Timing_info_read) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.Timing_info_read
attr.set_value(self.attr_Timing_info_read)
-
-
#------------------------------------------------------------------
@@ -228,7 +246,7 @@ class DataBase (PyTango.Device_4Impl):
def read_attr_hardware(self, data):
self.debug_stream("In " + self.get_name() + ".read_attr_hardware()")
#----- PROTECTED REGION ID(DataBase.read_attr_hardware) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.read_attr_hardware
@@ -250,32 +268,32 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbAddDevice()")
+ self.debug_stream("In " + self.get_name() + ".DbAddDevice()")
#----- PROTECTED REGION ID(DataBase.DbAddDevice) ENABLED START -----#
-
+
if len(argin) < 3:
self.warn_stream("DataBase::AddDevice(): incorrect number of input arguments ")
- th_exc(DB_IncorrectArguments,
+ th_exc(DB_IncorrectArguments,
"incorrect no. of input arguments, needs at least 3 (server,device,class)",
"DataBase::AddDevice()")
-
+
self.info_stream("DataBase::AddDevice(): insert " + argin[0] + " %s server with device " + argin[1])
server_name, d_name, klass_name = argin[:3]
if len(argin) > 3:
alias = argin[3]
else:
- alias = None
-
+ alias = None
+
ret, dev_name, dfm = check_device_name(d_name)
if not ret:
- th_exc(DB_IncorrectDeviceName,
+ th_exc(DB_IncorrectDeviceName,
"device name (" + d_name + ") syntax error (should be [tango:][//instance/]domain/family/member)",
"DataBase::AddDevice()")
# Lock table
self.db.add_device(server_name, (dev_name, dfm) , klass_name, alias=alias)
-
+
#----- PROTECTED REGION END -----# // DataBase.DbAddDevice
-
+
#------------------------------------------------------------------
# DbAddServer command:
#------------------------------------------------------------------
@@ -290,32 +308,32 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbAddServer()")
+ self.debug_stream("In " + self.get_name() + ".DbAddServer()")
#----- PROTECTED REGION ID(DataBase.DbAddServer) ENABLED START -----#
-
+
if len(argin) < 3 or not len(argin) % 2:
self.warn_stream("DataBase::AddServer(): incorrect number of input arguments ")
- th_exc(DB_IncorrectArguments,
+ th_exc(DB_IncorrectArguments,
"incorrect no. of input arguments, needs at least 3 (server,device,class)",
- "DataBase::AddServer()")
+ "DataBase::AddServer()")
server_name = argin[0]
-
+
db = self.db
cursor = db.get_cursor()
- for i in range((len(argin)-1)/2):
- d_name, klass_name = argin[i*2+1], argin[i*2+2]
+ for i in range((len(argin) - 1) / 2):
+ d_name, klass_name = argin[i * 2 + 1], argin[i * 2 + 2]
ret, dev_name, dfm = check_device_name(d_name)
if not ret:
- th_exc(DB_IncorrectDeviceName,
+ th_exc(DB_IncorrectDeviceName,
"device name (" + d_name + ") syntax error (should be [tango:][//instance/]domain/family/member)",
"DataBase::AddServer()")
db.add_device(server_name, (dev_name, dfm) , klass_name, cursor=cursor)
-
+
cursor.connection.commit()
cursor.close()
-
+
#----- PROTECTED REGION END -----# // DataBase.DbAddServer
-
+
#------------------------------------------------------------------
# DbDeleteAttributeAlias command:
#------------------------------------------------------------------
@@ -326,13 +344,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbDeleteAttributeAlias()")
+ self.debug_stream("In " + self.get_name() + ".DbDeleteAttributeAlias()")
#----- PROTECTED REGION ID(DataBase.DbDeleteAttributeAlias) ENABLED START -----#
-
+
self.db.delete_attribute_alias(argin)
-
+
#----- PROTECTED REGION END -----# // DataBase.DbDeleteAttributeAlias
-
+
#------------------------------------------------------------------
# DbDeleteClassAttribute command:
#------------------------------------------------------------------
@@ -344,21 +362,21 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbDeleteClassAttribute()")
+ self.debug_stream("In " + self.get_name() + ".DbDeleteClassAttribute()")
#----- PROTECTED REGION ID(DataBase.DbDeleteClassAttribute) ENABLED START -----#
-
+
if len(argin) < 2:
self.warn_stream("DataBase::db_delete_class_attribute(): insufficient number of arguments ")
- th_exc(DB_IncorrectArguments,
+ th_exc(DB_IncorrectArguments,
"insufficient number of arguments to delete class attribute",
"DataBase::DeleteClassAttribute()")
-
+
klass_name, attr_name = argin[:2]
-
+
self.db.delete_class_attribute(klass_name, attr_name)
-
+
#----- PROTECTED REGION END -----# // DataBase.DbDeleteClassAttribute
-
+
#------------------------------------------------------------------
# DbDeleteClassAttributeProperty command:
#------------------------------------------------------------------
@@ -372,26 +390,26 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbDeleteClassAttributeProperty()")
+ self.debug_stream("In " + self.get_name() + ".DbDeleteClassAttributeProperty()")
#----- PROTECTED REGION ID(DataBase.DbDeleteClassAttributeProperty) ENABLED START -----#
if len(argin) < 3:
self.warn_stream("DataBase::db_delete_class_attribute_property(): insufficient number of arguments ")
- th_exc(DB_IncorrectArguments,
+ th_exc(DB_IncorrectArguments,
"insufficient number of arguments to delete class attribute property",
"DataBase::DeleteClassAttributeProperty()")
-
+
klass_name, attr_name = argin[:2]
- db = self.db
- cursor = db.get_cursor()
+ db = self.db
+ cursor = db.get_cursor()
for prop_name in argin[2:]:
db.delete_class_attribute_property(klass_name, attr_name, prop_name, cursor=cursor)
cursor.connection.commit()
- cursor.close()
+ cursor.close()
#----- PROTECTED REGION END -----# // DataBase.DbDeleteClassAttributeProperty
-
+
#------------------------------------------------------------------
# DbDeleteClassProperty command:
#------------------------------------------------------------------
@@ -404,20 +422,20 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbDeleteClassProperty()")
+ self.debug_stream("In " + self.get_name() + ".DbDeleteClassProperty()")
#----- PROTECTED REGION ID(DataBase.DbDeleteClassProperty) ENABLED START -----#
-
+
klass_name = argin[0]
-
+
db = self.db
cursor = db.get_cursor()
for prop_name in argin[1:]:
db.delete_class_property(prop_name, cursor=cursor)
cursor.connection.commit()
cursor.close()
-
+
#----- PROTECTED REGION END -----# // DataBase.DbDeleteClassProperty
-
+
#------------------------------------------------------------------
# DbDeleteDevice command:
#------------------------------------------------------------------
@@ -428,19 +446,19 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbDeleteDevice()")
+ self.debug_stream("In " + self.get_name() + ".DbDeleteDevice()")
#----- PROTECTED REGION ID(DataBase.DbDeleteDevice) ENABLED START -----#
-
+
ret, dev_name, dfm = check_device_name(argin)
if not ret:
self.warn_stream("DataBase::db_delete_device(): device name " + argin + " incorrect ")
- th_exc(DB_IncorrectDeviceName,
+ th_exc(DB_IncorrectDeviceName,
"failed to delete device, device name incorrect",
"DataBase::DeleteDevice()")
self.db.delete_device(dev_name)
-
+
#----- PROTECTED REGION END -----# // DataBase.DbDeleteDevice
-
+
#------------------------------------------------------------------
# DbDeleteDeviceAlias command:
#------------------------------------------------------------------
@@ -451,13 +469,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbDeleteDeviceAlias()")
+ self.debug_stream("In " + self.get_name() + ".DbDeleteDeviceAlias()")
#----- PROTECTED REGION ID(DataBase.DbDeleteDeviceAlias) ENABLED START -----#
-
+
self.db.delete_device_alias(argin)
-
+
#----- PROTECTED REGION END -----# // DataBase.DbDeleteDeviceAlias
-
+
#------------------------------------------------------------------
# DbDeleteDeviceAttribute command:
#------------------------------------------------------------------
@@ -469,28 +487,28 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbDeleteDeviceAttribute()")
+ self.debug_stream("In " + self.get_name() + ".DbDeleteDeviceAttribute()")
#----- PROTECTED REGION ID(DataBase.DbDeleteDeviceAttribute) ENABLED START -----#
-
+
if len(argin) < 2:
self.warn_stream("DataBase::db_delete_device_attribute(): insufficient number of arguments ")
- th_exc(DB_IncorrectArguments,
+ th_exc(DB_IncorrectArguments,
"insufficient number of arguments to delete device attribute",
"DataBase::DeleteDeviceAttribute()")
-
+
dev_name, attr_name = argin[:2]
ret, dev_name, dfm = check_device_name(argin)
if not ret:
self.warn_stream("DataBase::db_delete_device_attribute(): device name " + dev_name + " incorrect ")
- th_exc(DB_IncorrectDeviceName,
+ th_exc(DB_IncorrectDeviceName,
"failed to delete device attribute, device name incorrect",
- "DataBase::DeleteDeviceAttribute()")
-
+ "DataBase::DeleteDeviceAttribute()")
+
self.db.delete_device_attribute(dev_name, attr_name)
-
+
#----- PROTECTED REGION END -----# // DataBase.DbDeleteDeviceAttribute
-
+
#------------------------------------------------------------------
# DbDeleteDeviceAttributeProperty command:
#------------------------------------------------------------------
@@ -504,35 +522,35 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbDeleteDeviceAttributeProperty()")
+ self.debug_stream("In " + self.get_name() + ".DbDeleteDeviceAttributeProperty()")
#----- PROTECTED REGION ID(DataBase.DbDeleteDeviceAttributeProperty) ENABLED START -----#
if len(argin) < 3:
self.warn_stream("DataBase::db_delete_device_attribute_property(): insufficient number of arguments ")
- th_exc(DB_IncorrectArguments,
+ th_exc(DB_IncorrectArguments,
"insufficient number of arguments to delete device attribute property",
"DataBase::DeleteDeviceAttributeProperty()")
-
+
dev_name, attr_name = argin[:2]
ret, dev_name, dfm = check_device_name(argin)
if not ret:
self.warn_stream("DataBase::db_delete_device_attribute_property(): device name " + dev_name + " incorrect ")
- th_exc(DB_IncorrectDeviceName,
+ th_exc(DB_IncorrectDeviceName,
"failed to delete device attribute property, device name incorrect",
- "DataBase::DeleteDeviceAttributeProperty()")
-
+ "DataBase::DeleteDeviceAttributeProperty()")
+
db = self.db
cursor = db.get_cursor()
for prop_name in argin[2:]:
self.db.delete_device_attribute_property(dev_name, attr_name, prop_name, cursor=cursor)
cursor.connection.commit()
cursor.close()
-
-
-
+
+
+
#----- PROTECTED REGION END -----# // DataBase.DbDeleteDeviceAttributeProperty
-
+
#------------------------------------------------------------------
# DbDeleteDeviceProperty command:
#------------------------------------------------------------------
@@ -545,19 +563,19 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbDeleteDeviceProperty()")
+ self.debug_stream("In " + self.get_name() + ".DbDeleteDeviceProperty()")
#----- PROTECTED REGION ID(DataBase.DbDeleteDeviceProperty) ENABLED START -----#
dev_name = argin[0]
db = self.db
- cursor = db.get_cursor()
+ cursor = db.get_cursor()
for prop_name in argin[1:]:
self.db.delete_device_property(dev_name, prop_name)
cursor.connection.commit()
cursor.close()
-
+
#----- PROTECTED REGION END -----# // DataBase.DbDeleteDeviceProperty
-
+
#------------------------------------------------------------------
# DbDeleteProperty command:
#------------------------------------------------------------------
@@ -570,19 +588,19 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbDeleteProperty()")
+ self.debug_stream("In " + self.get_name() + ".DbDeleteProperty()")
#----- PROTECTED REGION ID(DataBase.DbDeleteProperty) ENABLED START -----#
-
+
obj_name = argin[0];
db = self.db
- cursor = db.get_cursor()
+ cursor = db.get_cursor()
for prop_name in argin[1:]:
self.db.delete_property(obj_name, prop_name)
cursor.connection.commit()
- cursor.close()
-
+ cursor.close()
+
#----- PROTECTED REGION END -----# // DataBase.DbDeleteProperty
-
+
#------------------------------------------------------------------
# DbDeleteServer command:
#------------------------------------------------------------------
@@ -593,19 +611,19 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbDeleteServer()")
+ self.debug_stream("In " + self.get_name() + ".DbDeleteServer()")
#----- PROTECTED REGION ID(DataBase.DbDeleteServer) ENABLED START -----#
if '*' in argin or '%' in argin or not '/' in argin:
self.warn_stream("DataBase::db_delete_server(): server name " + argin + " incorrect ")
- th_exc(DB_IncorrectServerName,
+ th_exc(DB_IncorrectServerName,
"failed to delete server, server name incorrect",
"DataBase::DeleteServer()")
-
+
self.db.delete_server(argin)
-
+
#----- PROTECTED REGION END -----# // DataBase.DbDeleteServer
-
+
#------------------------------------------------------------------
# DbDeleteServerInfo command:
#------------------------------------------------------------------
@@ -616,13 +634,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbDeleteServerInfo()")
+ self.debug_stream("In " + self.get_name() + ".DbDeleteServerInfo()")
#----- PROTECTED REGION ID(DataBase.DbDeleteServerInfo) ENABLED START -----#
-
+
self.db.delete_server_info(argin)
-
+
#----- PROTECTED REGION END -----# // DataBase.DbDeleteServerInfo
-
+
#------------------------------------------------------------------
# DbExportDevice command:
#------------------------------------------------------------------
@@ -637,22 +655,22 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbExportDevice()")
+ self.debug_stream("In " + self.get_name() + ".DbExportDevice()")
#----- PROTECTED REGION ID(DataBase.DbExportDevice) ENABLED START -----#
-
+
if len(argin) < 5:
self.warn_stream("DataBase::DbExportDevice(): insufficient export info for device ")
- th_exc(DB_IncorrectArguments,
+ th_exc(DB_IncorrectArguments,
"insufficient export info for device",
- "DataBase::ExportDevice()")
-
+ "DataBase::ExportDevice()")
+
dev_name, IOR, host, pid, version = argin[:5]
- if pid.lower() == 'null'):
+ if pid.lower() == 'null':
pid = "-1"
self.db.export_device(dev_name, IOR, host, pid, version)
-
+
#----- PROTECTED REGION END -----# // DataBase.DbExportDevice
-
+
#------------------------------------------------------------------
# DbExportEvent command:
#------------------------------------------------------------------
@@ -667,21 +685,21 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbExportEvent()")
+ self.debug_stream("In " + self.get_name() + ".DbExportEvent()")
#----- PROTECTED REGION ID(DataBase.DbExportEvent) ENABLED START -----#
-
- if len(argin) < 5:
+
+ if len(argin) < 5:
self.warn_stream("DataBase::db_export_event(): insufficient export info for event ")
- th_exc(DB_IncorrectArguments,
+ th_exc(DB_IncorrectArguments,
"insufficient export info for event",
- "DataBase::ExportEvent()")
-
+ "DataBase::ExportEvent()")
+
event, IOR, host, pid, version = argin[:5]
event = replace_wildcard(event.lower())
self.db.export_event(event, IOR, host, pid, version)
-
+
#----- PROTECTED REGION END -----# // DataBase.DbExportEvent
-
+
#------------------------------------------------------------------
# DbGetAliasDevice command:
#------------------------------------------------------------------
@@ -692,20 +710,20 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: Device name
:rtype: PyTango.DevString """
- self.debug_stream("In " + self.get_name() + ".DbGetAliasDevice()")
+ self.debug_stream("In " + self.get_name() + ".DbGetAliasDevice()")
argout = ''
#----- PROTECTED REGION ID(DataBase.DbGetAliasDevice) ENABLED START -----#
if not argin:
argin = "%"
else:
- argin = replace_wildcard(argin)
-
+ argin = replace_wildcard(argin)
+
argout = self.db.get_alias_device(argin)
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetAliasDevice
return argout
-
+
#------------------------------------------------------------------
# DbGetAttributeAlias command:
#------------------------------------------------------------------
@@ -717,15 +735,15 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: The attribute name (device/attribute)
:rtype: PyTango.DevString """
- self.debug_stream("In " + self.get_name() + ".DbGetAttributeAlias()")
+ self.debug_stream("In " + self.get_name() + ".DbGetAttributeAlias()")
argout = ''
#----- PROTECTED REGION ID(DataBase.DbGetAttributeAlias) ENABLED START -----#
-
+
argout = self.db.get_attribute_alias(argin)
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetAttributeAlias
return argout
-
+
#------------------------------------------------------------------
# DbGetAttributeAliasList command:
#------------------------------------------------------------------
@@ -736,20 +754,20 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: attribute aliases
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetAttributeAliasList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetAttributeAliasList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetAttributeAliasList) ENABLED START -----#
-
+
if not argin:
argin = "%"
else:
- argin = replace_wildcard(argin)
-
+ argin = replace_wildcard(argin)
+
argout = self.db.get_attribute_alias_list(argin)
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetAttributeAliasList
return argout
-
+
#------------------------------------------------------------------
# DbGetClassAttributeList command:
#------------------------------------------------------------------
@@ -762,15 +780,21 @@ class DataBase (PyTango.Device_4Impl):
:return: Str[0] = Class attribute name
Str[n] = Class attribute name
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetClassAttributeList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetClassAttributeList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetClassAttributeList) ENABLED START -----#
-
-
-
+
+ class_name = argin[0]
+ if len(argin) > 1:
+ wildcard = replace_wildcard(argin[1])
+ else:
+ wildcard = "%"
+
+ argout = self.db.get_class_attribute_list(class_name, wildcard)
+
#----- PROTECTED REGION END -----# // DataBase.DbGetClassAttributeList
return argout
-
+
#------------------------------------------------------------------
# DbGetClassAttributeProperty command:
#------------------------------------------------------------------
@@ -788,13 +812,16 @@ class DataBase (PyTango.Device_4Impl):
Str[n + 1] = Attribute property 2 name
Str[n + 2] = Attribute property 2 value
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetClassAttributeProperty()")
+ self.debug_stream("In " + self.get_name() + ".DbGetClassAttributeProperty()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetClassAttributeProperty) ENABLED START -----#
-
+
+ class_name = argin[0]
+ argout = self.db.get_class_attribute_property(clas_name, argout[1:])
+
#----- PROTECTED REGION END -----# // DataBase.DbGetClassAttributeProperty
return argout
-
+
#------------------------------------------------------------------
# DbGetClassAttributeProperty2 command:
#------------------------------------------------------------------
@@ -818,13 +845,16 @@ class DataBase (PyTango.Device_4Impl):
Str[n + 3] = Attribute property 2 value
Str[n + m] = Attribute property 2 value (array case)
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetClassAttributeProperty2()")
+ self.debug_stream("In " + self.get_name() + ".DbGetClassAttributeProperty2()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetClassAttributeProperty2) ENABLED START -----#
-
+
+ class_name = argin[0]
+ argout = self.db.get_class_attribute_property2(clas_name, argout[1:])
+
#----- PROTECTED REGION END -----# // DataBase.DbGetClassAttributeProperty2
return argout
-
+
#------------------------------------------------------------------
# DbGetClassAttributePropertyHist command:
#------------------------------------------------------------------
@@ -842,13 +872,13 @@ class DataBase (PyTango.Device_4Impl):
Str[4] = Property value 1
Str[n] = Property value n
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetClassAttributePropertyHist()")
+ self.debug_stream("In " + self.get_name() + ".DbGetClassAttributePropertyHist()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetClassAttributePropertyHist) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetClassAttributePropertyHist
return argout
-
+
#------------------------------------------------------------------
# DbGetClassForDevice command:
#------------------------------------------------------------------
@@ -859,13 +889,15 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: Device Tango class
:rtype: PyTango.DevString """
- self.debug_stream("In " + self.get_name() + ".DbGetClassForDevice()")
+ self.debug_stream("In " + self.get_name() + ".DbGetClassForDevice()")
argout = ''
#----- PROTECTED REGION ID(DataBase.DbGetClassForDevice) ENABLED START -----#
-
+
+ argout = self.db.get_class_for_device(argin)
+
#----- PROTECTED REGION END -----# // DataBase.DbGetClassForDevice
return argout
-
+
#------------------------------------------------------------------
# DbGetClassInheritanceForDevice command:
#------------------------------------------------------------------
@@ -879,13 +911,15 @@ class DataBase (PyTango.Device_4Impl):
[1] - is the class from the device class is inherited.
........and so on
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetClassInheritanceForDevice()")
+ self.debug_stream("In " + self.get_name() + ".DbGetClassInheritanceForDevice()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetClassInheritanceForDevice) ENABLED START -----#
-
+
+ argout = self.db.get_class_inheritance_for_device(argin)
+
#----- PROTECTED REGION END -----# // DataBase.DbGetClassInheritanceForDevice
return argout
-
+
#------------------------------------------------------------------
# DbGetClassList command:
#------------------------------------------------------------------
@@ -896,13 +930,16 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: Class list
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetClassList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetClassList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetClassList) ENABLED START -----#
-
+
+ server = replace_wildcard(argin)
+ argout = self.db.get_class_list(server)
+
#----- PROTECTED REGION END -----# // DataBase.DbGetClassList
return argout
-
+
#------------------------------------------------------------------
# DbGetClassProperty command:
#------------------------------------------------------------------
@@ -921,13 +958,13 @@ class DataBase (PyTango.Device_4Impl):
Str[n] = Propery value (array case)
....
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetClassProperty()")
+ self.debug_stream("In " + self.get_name() + ".DbGetClassProperty()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetClassProperty) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetClassProperty
return argout
-
+
#------------------------------------------------------------------
# DbGetClassPropertyHist command:
#------------------------------------------------------------------
@@ -943,13 +980,13 @@ class DataBase (PyTango.Device_4Impl):
Str[3] = Property value 1
Str[n] = Property value n
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetClassPropertyHist()")
+ self.debug_stream("In " + self.get_name() + ".DbGetClassPropertyHist()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetClassPropertyHist) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetClassPropertyHist
return argout
-
+
#------------------------------------------------------------------
# DbGetClassPropertyList command:
#------------------------------------------------------------------
@@ -960,13 +997,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: Property name list
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetClassPropertyList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetClassPropertyList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetClassPropertyList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetClassPropertyList
return argout
-
+
#------------------------------------------------------------------
# DbGetDeviceAlias command:
#------------------------------------------------------------------
@@ -977,13 +1014,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: The alias found
:rtype: PyTango.DevString """
- self.debug_stream("In " + self.get_name() + ".DbGetDeviceAlias()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDeviceAlias()")
argout = ''
#----- PROTECTED REGION ID(DataBase.DbGetDeviceAlias) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDeviceAlias
return argout
-
+
#------------------------------------------------------------------
# DbGetDeviceAliasList command:
#------------------------------------------------------------------
@@ -994,13 +1031,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: Device alias list
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDeviceAliasList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDeviceAliasList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDeviceAliasList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDeviceAliasList
return argout
-
+
#------------------------------------------------------------------
# DbGetDeviceAttributeList command:
#------------------------------------------------------------------
@@ -1013,13 +1050,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return: attribute name list
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDeviceAttributeList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDeviceAttributeList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDeviceAttributeList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDeviceAttributeList
return argout
-
+
#------------------------------------------------------------------
# DbGetDeviceAttributeProperty command:
#------------------------------------------------------------------
@@ -1037,13 +1074,13 @@ class DataBase (PyTango.Device_4Impl):
Str[n + 1] = Attribute property 2 name
Str[n + 2] = Attribute property 2 value
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDeviceAttributeProperty()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDeviceAttributeProperty()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDeviceAttributeProperty) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDeviceAttributeProperty
return argout
-
+
#------------------------------------------------------------------
# DbGetDeviceAttributeProperty2 command:
#------------------------------------------------------------------
@@ -1068,13 +1105,13 @@ class DataBase (PyTango.Device_4Impl):
Str[n + 3] = Attribute property 2 value
Str[n + m] = Attribute property 2 value (array case)
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDeviceAttributeProperty2()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDeviceAttributeProperty2()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDeviceAttributeProperty2) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDeviceAttributeProperty2
return argout
-
+
#------------------------------------------------------------------
# DbGetDeviceAttributePropertyHist command:
#------------------------------------------------------------------
@@ -1092,13 +1129,13 @@ class DataBase (PyTango.Device_4Impl):
Str[4] = Property value 1
Str[n] = Property value n
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDeviceAttributePropertyHist()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDeviceAttributePropertyHist()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDeviceAttributePropertyHist) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDeviceAttributePropertyHist
return argout
-
+
#------------------------------------------------------------------
# DbGetDeviceClassList command:
#------------------------------------------------------------------
@@ -1112,13 +1149,13 @@ class DataBase (PyTango.Device_4Impl):
Str[n] = Device name
Str[n + 1] = Tango class
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDeviceClassList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDeviceClassList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDeviceClassList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDeviceClassList
return argout
-
+
#------------------------------------------------------------------
# DbGetDeviceDomainList command:
#------------------------------------------------------------------
@@ -1129,13 +1166,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: Device name domain list
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDeviceDomainList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDeviceDomainList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDeviceDomainList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDeviceDomainList
return argout
-
+
#------------------------------------------------------------------
# DbGetDeviceExportedList command:
#------------------------------------------------------------------
@@ -1146,13 +1183,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: list of exported devices
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDeviceExportedList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDeviceExportedList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDeviceExportedList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDeviceExportedList
return argout
-
+
#------------------------------------------------------------------
# DbGetDeviceFamilyList command:
#------------------------------------------------------------------
@@ -1164,13 +1201,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: Family list
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDeviceFamilyList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDeviceFamilyList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDeviceFamilyList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDeviceFamilyList
return argout
-
+
#------------------------------------------------------------------
# DbGetDeviceInfo command:
#------------------------------------------------------------------
@@ -1191,13 +1228,13 @@ class DataBase (PyTango.Device_4Impl):
Lg[0] = Device exported flag
Lg[1] = Device Server process PID (or -1 if not set)
:rtype: PyTango.DevVarLongStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDeviceInfo()")
- argout = [0],['']
+ self.debug_stream("In " + self.get_name() + ".DbGetDeviceInfo()")
+ argout = [0], ['']
#----- PROTECTED REGION ID(DataBase.DbGetDeviceInfo) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDeviceInfo
return argout
-
+
#------------------------------------------------------------------
# DbGetDeviceList command:
#------------------------------------------------------------------
@@ -1209,13 +1246,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return: The list of devices for specified server and class.
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDeviceList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDeviceList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDeviceList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDeviceList
return argout
-
+
#------------------------------------------------------------------
# DbGetDeviceWideList command:
#------------------------------------------------------------------
@@ -1226,13 +1263,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: list of exported devices
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDeviceWideList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDeviceWideList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDeviceWideList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDeviceWideList
return argout
-
+
#------------------------------------------------------------------
# DbGetDeviceMemberList command:
#------------------------------------------------------------------
@@ -1244,13 +1281,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: Device names member list
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDeviceMemberList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDeviceMemberList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDeviceMemberList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDeviceMemberList
return argout
-
+
#------------------------------------------------------------------
# DbGetDeviceProperty command:
#------------------------------------------------------------------
@@ -1272,13 +1309,13 @@ class DataBase (PyTango.Device_4Impl):
Str[n + 3] = Property value 1
Str[n + m] = Property value m
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDeviceProperty()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDeviceProperty()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDeviceProperty) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDeviceProperty
return argout
-
+
#------------------------------------------------------------------
# DbGetDevicePropertyHist command:
#------------------------------------------------------------------
@@ -1294,13 +1331,13 @@ class DataBase (PyTango.Device_4Impl):
Str[3] = Property value 1
Str[n] = Property value n
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDevicePropertyHist()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDevicePropertyHist()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDevicePropertyHist) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDevicePropertyHist
return argout
-
+
#------------------------------------------------------------------
# DbGetDevicePropertyList command:
#------------------------------------------------------------------
@@ -1313,13 +1350,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return: Property name list
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDevicePropertyList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDevicePropertyList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDevicePropertyList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDevicePropertyList
return argout
-
+
#------------------------------------------------------------------
# DbGetDeviceServerClassList command:
#------------------------------------------------------------------
@@ -1330,13 +1367,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: list of classes for this device server
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDeviceServerClassList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDeviceServerClassList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDeviceServerClassList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDeviceServerClassList
return argout
-
+
#------------------------------------------------------------------
# DbGetExportdDeviceListForClass command:
#------------------------------------------------------------------
@@ -1347,13 +1384,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: Device exported list
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetExportdDeviceListForClass()")
+ self.debug_stream("In " + self.get_name() + ".DbGetExportdDeviceListForClass()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetExportdDeviceListForClass) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetExportdDeviceListForClass
return argout
-
+
#------------------------------------------------------------------
# DbGetHostList command:
#------------------------------------------------------------------
@@ -1364,13 +1401,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: Host name list
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetHostList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetHostList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetHostList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetHostList
return argout
-
+
#------------------------------------------------------------------
# DbGetHostServerList command:
#------------------------------------------------------------------
@@ -1382,13 +1419,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: Device server process name list
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetHostServerList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetHostServerList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetHostServerList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetHostServerList
return argout
-
+
#------------------------------------------------------------------
# DbGetHostServersInfo command:
#------------------------------------------------------------------
@@ -1399,13 +1436,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: Server info for all servers running on specified host
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetHostServersInfo()")
+ self.debug_stream("In " + self.get_name() + ".DbGetHostServersInfo()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetHostServersInfo) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetHostServersInfo
return argout
-
+
#------------------------------------------------------------------
# DbGetInstanceNameList command:
#------------------------------------------------------------------
@@ -1416,13 +1453,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: The instance names found for specified server.
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetInstanceNameList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetInstanceNameList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetInstanceNameList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetInstanceNameList
return argout
-
+
#------------------------------------------------------------------
# DbGetObjectList command:
#------------------------------------------------------------------
@@ -1434,13 +1471,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: Object name list
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetObjectList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetObjectList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetObjectList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetObjectList
return argout
-
+
#------------------------------------------------------------------
# DbGetProperty command:
#------------------------------------------------------------------
@@ -1462,13 +1499,13 @@ class DataBase (PyTango.Device_4Impl):
Str[n + 3] = Property value 1
Str[n + m] = Property value m
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetProperty()")
+ self.debug_stream("In " + self.get_name() + ".DbGetProperty()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetProperty) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetProperty
return argout
-
+
#------------------------------------------------------------------
# DbGetPropertyHist command:
#------------------------------------------------------------------
@@ -1484,13 +1521,13 @@ class DataBase (PyTango.Device_4Impl):
Str[3] = Property value 1
Str[n] = Property value n
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetPropertyHist()")
+ self.debug_stream("In " + self.get_name() + ".DbGetPropertyHist()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetPropertyHist) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetPropertyHist
return argout
-
+
#------------------------------------------------------------------
# DbGetPropertyList command:
#------------------------------------------------------------------
@@ -1503,13 +1540,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return: Property name list
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetPropertyList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetPropertyList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetPropertyList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetPropertyList
return argout
-
+
#------------------------------------------------------------------
# DbGetServerInfo command:
#------------------------------------------------------------------
@@ -1520,13 +1557,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: server info
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetServerInfo()")
+ self.debug_stream("In " + self.get_name() + ".DbGetServerInfo()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetServerInfo) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetServerInfo
return argout
-
+
#------------------------------------------------------------------
# DbGetServerList command:
#------------------------------------------------------------------
@@ -1538,13 +1575,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: Device server process name list
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetServerList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetServerList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetServerList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetServerList
return argout
-
+
#------------------------------------------------------------------
# DbGetServerNameList command:
#------------------------------------------------------------------
@@ -1556,13 +1593,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: server names found.
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetServerNameList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetServerNameList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetServerNameList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetServerNameList
return argout
-
+
#------------------------------------------------------------------
# DbImportDevice command:
#------------------------------------------------------------------
@@ -1581,13 +1618,13 @@ class DataBase (PyTango.Device_4Impl):
Lg[0] = Exported flag
Lg[1] = Device server process PID
:rtype: PyTango.DevVarLongStringArray """
- self.debug_stream("In " + self.get_name() + ".DbImportDevice()")
- argout = [0],['']
+ self.debug_stream("In " + self.get_name() + ".DbImportDevice()")
+ argout = [0], ['']
#----- PROTECTED REGION ID(DataBase.DbImportDevice) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbImportDevice
return argout
-
+
#------------------------------------------------------------------
# DbImportEvent command:
#------------------------------------------------------------------
@@ -1598,13 +1635,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: export information e.g. IOR
:rtype: PyTango.DevVarLongStringArray """
- self.debug_stream("In " + self.get_name() + ".DbImportEvent()")
- argout = [0],['']
+ self.debug_stream("In " + self.get_name() + ".DbImportEvent()")
+ argout = [0], ['']
#----- PROTECTED REGION ID(DataBase.DbImportEvent) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbImportEvent
return argout
-
+
#------------------------------------------------------------------
# DbInfo command:
#------------------------------------------------------------------
@@ -1625,13 +1662,13 @@ class DataBase (PyTango.Device_4Impl):
- Class attribute properties defined in database
- Object properties defined in database
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbInfo()")
+ self.debug_stream("In " + self.get_name() + ".DbInfo()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbInfo) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbInfo
return argout
-
+
#------------------------------------------------------------------
# DbPutAttributeAlias command:
#------------------------------------------------------------------
@@ -1643,11 +1680,11 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbPutAttributeAlias()")
+ self.debug_stream("In " + self.get_name() + ".DbPutAttributeAlias()")
#----- PROTECTED REGION ID(DataBase.DbPutAttributeAlias) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbPutAttributeAlias
-
+
#------------------------------------------------------------------
# DbPutClassAttributeProperty command:
#------------------------------------------------------------------
@@ -1664,11 +1701,11 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbPutClassAttributeProperty()")
+ self.debug_stream("In " + self.get_name() + ".DbPutClassAttributeProperty()")
#----- PROTECTED REGION ID(DataBase.DbPutClassAttributeProperty) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbPutClassAttributeProperty
-
+
#------------------------------------------------------------------
# DbPutClassAttributeProperty2 command:
#------------------------------------------------------------------
@@ -1688,11 +1725,11 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbPutClassAttributeProperty2()")
+ self.debug_stream("In " + self.get_name() + ".DbPutClassAttributeProperty2()")
#----- PROTECTED REGION ID(DataBase.DbPutClassAttributeProperty2) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbPutClassAttributeProperty2
-
+
#------------------------------------------------------------------
# DbPutClassProperty command:
#------------------------------------------------------------------
@@ -1709,11 +1746,11 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbPutClassProperty()")
+ self.debug_stream("In " + self.get_name() + ".DbPutClassProperty()")
#----- PROTECTED REGION ID(DataBase.DbPutClassProperty) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbPutClassProperty
-
+
#------------------------------------------------------------------
# DbPutDeviceAlias command:
#------------------------------------------------------------------
@@ -1725,11 +1762,11 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbPutDeviceAlias()")
+ self.debug_stream("In " + self.get_name() + ".DbPutDeviceAlias()")
#----- PROTECTED REGION ID(DataBase.DbPutDeviceAlias) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbPutDeviceAlias
-
+
#------------------------------------------------------------------
# DbPutDeviceAttributeProperty command:
#------------------------------------------------------------------
@@ -1746,11 +1783,11 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbPutDeviceAttributeProperty()")
+ self.debug_stream("In " + self.get_name() + ".DbPutDeviceAttributeProperty()")
#----- PROTECTED REGION ID(DataBase.DbPutDeviceAttributeProperty) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbPutDeviceAttributeProperty
-
+
#------------------------------------------------------------------
# DbPutDeviceAttributeProperty2 command:
#------------------------------------------------------------------
@@ -1771,11 +1808,11 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbPutDeviceAttributeProperty2()")
+ self.debug_stream("In " + self.get_name() + ".DbPutDeviceAttributeProperty2()")
#----- PROTECTED REGION ID(DataBase.DbPutDeviceAttributeProperty2) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbPutDeviceAttributeProperty2
-
+
#------------------------------------------------------------------
# DbPutDeviceProperty command:
#------------------------------------------------------------------
@@ -1792,11 +1829,11 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbPutDeviceProperty()")
+ self.debug_stream("In " + self.get_name() + ".DbPutDeviceProperty()")
#----- PROTECTED REGION ID(DataBase.DbPutDeviceProperty) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbPutDeviceProperty
-
+
#------------------------------------------------------------------
# DbPutProperty command:
#------------------------------------------------------------------
@@ -1813,11 +1850,11 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbPutProperty()")
+ self.debug_stream("In " + self.get_name() + ".DbPutProperty()")
#----- PROTECTED REGION ID(DataBase.DbPutProperty) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbPutProperty
-
+
#------------------------------------------------------------------
# DbPutServerInfo command:
#------------------------------------------------------------------
@@ -1828,11 +1865,11 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbPutServerInfo()")
+ self.debug_stream("In " + self.get_name() + ".DbPutServerInfo()")
#----- PROTECTED REGION ID(DataBase.DbPutServerInfo) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbPutServerInfo
-
+
#------------------------------------------------------------------
# DbUnExportDevice command:
#------------------------------------------------------------------
@@ -1843,11 +1880,11 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbUnExportDevice()")
+ self.debug_stream("In " + self.get_name() + ".DbUnExportDevice()")
#----- PROTECTED REGION ID(DataBase.DbUnExportDevice) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbUnExportDevice
-
+
#------------------------------------------------------------------
# DbUnExportEvent command:
#------------------------------------------------------------------
@@ -1858,11 +1895,11 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: none
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbUnExportEvent()")
+ self.debug_stream("In " + self.get_name() + ".DbUnExportEvent()")
#----- PROTECTED REGION ID(DataBase.DbUnExportEvent) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbUnExportEvent
-
+
#------------------------------------------------------------------
# DbUnExportServer command:
#------------------------------------------------------------------
@@ -1874,11 +1911,11 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbUnExportServer()")
+ self.debug_stream("In " + self.get_name() + ".DbUnExportServer()")
#----- PROTECTED REGION ID(DataBase.DbUnExportServer) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbUnExportServer
-
+
#------------------------------------------------------------------
# ResetTimingValues command:
#------------------------------------------------------------------
@@ -1889,11 +1926,11 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVoid
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".ResetTimingValues()")
+ self.debug_stream("In " + self.get_name() + ".ResetTimingValues()")
#----- PROTECTED REGION ID(DataBase.ResetTimingValues) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.ResetTimingValues
-
+
#------------------------------------------------------------------
# DbGetDataForServerCache command:
#------------------------------------------------------------------
@@ -1906,13 +1943,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return: All the data needed by the device server during its startup sequence. Precise list depend on the device server
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetDataForServerCache()")
+ self.debug_stream("In " + self.get_name() + ".DbGetDataForServerCache()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetDataForServerCache) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetDataForServerCache
return argout
-
+
#------------------------------------------------------------------
# DbDeleteAllDeviceAttributeProperty command:
#------------------------------------------------------------------
@@ -1924,11 +1961,11 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVarStringArray
:return:
:rtype: PyTango.DevVoid """
- self.debug_stream("In " + self.get_name() + ".DbDeleteAllDeviceAttributeProperty()")
+ self.debug_stream("In " + self.get_name() + ".DbDeleteAllDeviceAttributeProperty()")
#----- PROTECTED REGION ID(DataBase.DbDeleteAllDeviceAttributeProperty) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbDeleteAllDeviceAttributeProperty
-
+
#------------------------------------------------------------------
# DbMySqlSelect command:
#------------------------------------------------------------------
@@ -1943,13 +1980,13 @@ class DataBase (PyTango.Device_4Impl):
- lvalue[n] : =0 if svalue[n] is null else =1
(last lvalue -1) is number of rows, (last lvalue) is number of fields
:rtype: PyTango.DevVarLongStringArray """
- self.debug_stream("In " + self.get_name() + ".DbMySqlSelect()")
- argout = [0],['']
+ self.debug_stream("In " + self.get_name() + ".DbMySqlSelect()")
+ argout = [0], ['']
#----- PROTECTED REGION ID(DataBase.DbMySqlSelect) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbMySqlSelect
return argout
-
+
#------------------------------------------------------------------
# DbGetCSDbServerList command:
#------------------------------------------------------------------
@@ -1960,13 +1997,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevVoid
:return: List of host:port with one element for each database server
:rtype: PyTango.DevVarStringArray """
- self.debug_stream("In " + self.get_name() + ".DbGetCSDbServerList()")
+ self.debug_stream("In " + self.get_name() + ".DbGetCSDbServerList()")
argout = ['']
#----- PROTECTED REGION ID(DataBase.DbGetCSDbServerList) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetCSDbServerList
return argout
-
+
#------------------------------------------------------------------
# DbGetAttributeAlias2 command:
#------------------------------------------------------------------
@@ -1978,13 +2015,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: The attribute alias name (or empty string)
:rtype: PyTango.DevString """
- self.debug_stream("In " + self.get_name() + ".DbGetAttributeAlias2()")
+ self.debug_stream("In " + self.get_name() + ".DbGetAttributeAlias2()")
argout = ''
#----- PROTECTED REGION ID(DataBase.DbGetAttributeAlias2) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetAttributeAlias2
return argout
-
+
#------------------------------------------------------------------
# DbGetAliasAttribute command:
#------------------------------------------------------------------
@@ -1996,13 +2033,13 @@ class DataBase (PyTango.Device_4Impl):
:type: PyTango.DevString
:return: The attribute name (dev_name/att_name)
:rtype: PyTango.DevString """
- self.debug_stream("In " + self.get_name() + ".DbGetAliasAttribute()")
+ self.debug_stream("In " + self.get_name() + ".DbGetAliasAttribute()")
argout = ''
#----- PROTECTED REGION ID(DataBase.DbGetAliasAttribute) ENABLED START -----#
-
+
#----- PROTECTED REGION END -----# // DataBase.DbGetAliasAttribute
return argout
-
+
#==================================================================
#
@@ -2313,24 +2350,53 @@ class DataBaseClass(PyTango.DeviceClass):
self.set_type(name);
print "In DataBase Class constructor"
+ def device_factory(self, names):
+ names = [get_db_name()]
+ return PyTango.DeviceClass.device_factory(self, names)
+
#==================================================================
#
# DataBase class main method
#
#==================================================================
def main():
+ log_fmt = '%(threadName)-14s %(levelname)-8s %(asctime)s %(name)s: %(message)s'
+ logging.basicConfig(format=log_fmt, stream=sys.stdout, level=logging.INFO)
try:
+ db_name = "sys/database/" + sys.argv[1]
+ set_db_name(db_name)
+ PyTango.Util.set_use_db(False)
py = PyTango.Util(sys.argv)
- py.add_class(DataBaseClass,DataBase,'DataBase')
+ py.add_class(DataBaseClass, DataBase, 'DataBase')
U = PyTango.Util.instance()
+ dbi = DbInter()
+ U.set_interceptors(dbi)
+ U.set_serial_model(PyTango.SerialModel.NO_SYNC)
U.server_init()
- U.server_run()
+ dserver = U.get_dserver_device()
+ dbase = U.get_device_by_name(db_name)
+
+ dserver.duplicate_d_var()
+
+ pars = [dserver.get_name(), U.get_dserver_ior(dserver),
+ U.get_host_name(), U.get_pid_str(), U.get_version_str()]
+ dbase.DbExportDevice(pars)
+
+ pars[0] = dbase.get_name()
+ pars[1] = U.get_device_ior(dbase)
+ dbase.DbExportDevice(pars)
+
+ print "Ready to accept request"
+ U.orb_run()
+
- except PyTango.DevFailed,e:
- print '-------> Received a DevFailed exception:',e
- except Exception,e:
- print '-------> An unforeseen exception occured....',e
+ except PyTango.DevFailed as df:
+ print '-------> Received a DevFailed exception:', df
+ import traceback;traceback.print_exc()
+ except Exception as e:
+ print '-------> An unforeseen exception occured....', e
+ import traceback;traceback.print_exc()
if __name__ == '__main__':
main()
diff --git a/src/boost/python/databaseds/db_access.py b/src/boost/python/databaseds/db_access.py
index 49b28a2..6faa291 100644
--- a/src/boost/python/databaseds/db_access.py
+++ b/src/boost/python/databaseds/db_access.py
@@ -1,6 +1,7 @@
from __future__ import print_function
import os
+import logging
import functools
import PyTango
@@ -11,26 +12,26 @@ from db_errors import *
def get_create_db_statements():
statements = []
- with open("create_db_tables.sql.in") as f:
+ with open("create_db_tables.sql") as f:
lines = f.readlines()
# strip comments
- lines = ( line for line in lines if not line.startswith('#') )
- lines = ( line for line in lines if not line.lower().strip().startswith('key') )
- lines = ( line for line in lines if not line.lower().strip().startswith('key') )
+ lines = (line for line in lines if not line.startswith('#'))
+ lines = (line for line in lines if not line.lower().strip().startswith('key'))
+ lines = (line for line in lines if not line.lower().strip().startswith('key'))
lines = "".join(lines)
- lines = lines.replace("ENGINE=MyISAM","")
+ lines = lines.replace("ENGINE=MyISAM", "")
statements += lines.split(";")
-
- with open("create_db.sql.in") as f:
+
+ with open("create_db.sql") as f:
lines = f.readlines()
# strip comments
- lines = ( line for line in lines if not line.lower().startswith('#') )
- lines = ( line for line in lines if not line.lower().startswith('create database') )
- lines = ( line for line in lines if not line.lower().startswith('use') )
- lines = ( line for line in lines if not line.lower().startswith('source') )
+ lines = (line for line in lines if not line.lower().startswith('#'))
+ lines = (line for line in lines if not line.lower().startswith('create database'))
+ lines = (line for line in lines if not line.lower().startswith('use'))
+ lines = (line for line in lines if not line.lower().startswith('source'))
lines = "".join(lines)
statements += lines.split(";")
-
+
return statements
def replace_wildcard(text):
@@ -45,7 +46,7 @@ def replace_wildcard(text):
# replace '*' with '%'
text = text.replace("*", "%")
return text
-
+
def use_cursor(f):
@functools.wraps(f)
def wrap(*args, **kwargs):
@@ -65,17 +66,23 @@ def use_cursor(f):
cursor.close()
del self.cursor
return wrap
-
+
class Tango_dbapi2(object):
-
+
DB_API_NAME = 'sqlite3'
-
+
def __init__(self, db_name="tango_database.db", history_depth=10, fire_to_starter=True):
self._db_api = None
self._db_conn = None
self.db_name = db_name
self.history_depth = history_depth;
self.fire_to_starter = fire_to_starter
+ self._logger = logging.getLogger(self.__class__.__name__)
+ self._debug = self._logger.info
+ self._info = self._logger.info
+ self._warn = self._logger.warn
+ self._error = self._logger.error
+ self._critical = self._logger.critical
self.initialize()
def close_db(self):
@@ -89,12 +96,12 @@ class Tango_dbapi2(object):
if self._db_api is None:
self._db_api = __import__(self.DB_API_NAME)
return self._db_api
-
+
@property
def db_api(self):
return self.get_db_api()
-
- @property
+
+ @property
def db_conn(self):
if self._db_conn is None:
self._db_conn = self.db_api.connect(self.db_name)
@@ -104,17 +111,18 @@ class Tango_dbapi2(object):
return self.db_conn.cursor()
def initialize(self):
+ self._info("Initializing database...")
if not os.path.isfile(self.db_name):
self.create_db()
-
+
@use_cursor
def create_db(self):
- print("Creating database...")
+ self._info("Creating database...")
statements = get_create_db_statements()
cursor = self.cursor
for statement in statements:
cursor.execute(statement)
-
+
@use_cursor
def get_id(self, name):
cursor = self.cursor
@@ -122,7 +130,7 @@ class Tango_dbapi2(object):
_id = cursor.execute('SELECT id FROM ?', (name,)).fetchone()[0] + 1
cursor.execute('UPDATE ? SET id=?', (name, _id))
return _id
-
+
@use_cursor
def purge_att_property(self, table, field, obj, attr, name):
cursor = self.cursor
@@ -134,7 +142,7 @@ class Tango_dbapi2(object):
if to_del > 0:
for row in rows[:to_del]:
cursor.execute('DELETE FROM ? WHERE id=?', (table, row[0]))
-
+
@use_cursor
def purge_property(self, table, field, obj, name):
cursor = self.cursor
@@ -159,25 +167,27 @@ class Tango_dbapi2(object):
return row[0]
# TANGO API
-
+
def get_stored_procedure_release(self):
return 'release 1.8'
@use_cursor
def add_device(self, server_name, dev_info, klass_name, alias=None):
+ self._info("delete_attribute_alias(server_name=%s, dev_info=%s, klass_name=%s, alias=%s)",
+ server_name, dev_info, klass_name, alias)
dev_name, (domain, family, member) = dev_info
cursor = self.cursor
-
+
# first delete the tuple (device,name) from the device table
cursor.execute('DELETE FROM device WHERE name LIKE ?', (dev_name,))
-
+
# then insert the new value for this tuple
cursor.execute(\
'INSERT INTO device (name, alias, domain, family, member, exported, ' \
'ior, host, server, pid, class, version, started, stopped) ' \
- 'VALUES (?, ?, ?, ?, ?, 0, "nada", "nada", ?, 0, ?, "0", NULL, NULL)',
+ 'VALUES (?, ?, ?, ?, ?, 0, "nada", "nada", ?, 0, ?, "0", NULL, NULL)',
(dev_name, alias, domain, family, member, server_name, klass_name))
-
+
# Check if a DServer device entry for the process already exists
cursor.execute('SELECT name FROM device WHERE server LIKE ? AND class LIKE "DServer"', (server_name,))
if cursor.fetchone() is None:
@@ -186,11 +196,12 @@ class Tango_dbapi2(object):
cursor.execute(\
'INSERT INTO device (name, domain, family, member, exported, ior, ' \
'host, server, pid, class, version, started, stopped) ' \
- 'VALUES (?, ?, ?, ?, 0, "nada", "nada", ?, 0, "DServer", "0", NULL, NULL)',
+ 'VALUES (?, ?, ?, ?, 0, "nada", "nada", ?, 0, "DServer", "0", NULL, NULL)',
(dev_name, domain, family, member, server_name))
@use_cursor
def delete_attribute_alias(self, alias):
+ self._info("delete_attribute_alias(alias=%s)", alias)
self.cursor.execute('DELETE FROM attribute_alias WHERE alias=?', (alias,))
@use_cursor
@@ -198,11 +209,11 @@ class Tango_dbapi2(object):
self.cursor.execute(\
'DELETE FROM property_attribute_class WHERE class LIKE ? AND ' \
'attribute LIKE ?', (klass_name, attr_name))
-
+
@use_cursor
def delete_class_attribute_property(self, klass_name, attr_name, prop_name):
cursor = self.cursor
-
+
# Is there something to delete ?
cursor.execute(\
'SELECT count(*) FROM property_attribute_class WHERE class = ? ' \
@@ -212,7 +223,7 @@ class Tango_dbapi2(object):
cursor.execute(\
'DELETE FROM property_attribute_class WHERE class = ? AND ' \
'attribute = ? and name = ?', (klass_name, attr_name, prop_name))
- # mark this property as deleted
+ # mark this property as deleted
hist_id = self.get_id('class_attibute', cursor=cursor)
cursor.execute(\
'INSERT INTO property_attribute_class_hist (class, attribute, ' \
@@ -221,7 +232,7 @@ class Tango_dbapi2(object):
(klass_name, attr_name, prop_name, hist_id))
self.purge_att_property("property_attribute_class_hist", "class",
klass_name, attr_name, prop_name, cursor=cursor)
-
+
@use_cursor
def delete_class_property(self, klass_name, prop_name):
cursor = self.cursor
@@ -243,34 +254,36 @@ class Tango_dbapi2(object):
'INSERT INTO property_class_hist (class, name, id, count, value) ' \
'VALUES (?, ?, ?, "0", "DELETED")',
(klass_name, name, hist_id))
- self.purge_property("property_class_hist", "class", klass_name,
+ self.purge_property("property_class_hist", "class", klass_name,
name, cursor=cursor)
-
+
@use_cursor
def delete_device(self, dev_name):
+ self._info("delete_device(dev_name=%s)", dev_name)
cursor = self.cursor
dev_name = replace_wildcard(dev_name)
-
+
# delete the device from the device table
cursor.execute('DELETE FROM device WHERE name LIKE ?', (dev_name,))
-
+
# delete device from the property_device table
cursor.execute('DELETE FROM property_device WHERE device LIKE ?', (dev_name,))
-
+
# delete device from the property_attribute_device table
cursor.execute('DELETE FROM property_attribute_device WHERE device LIKE ?', (dev_name,))
@use_cursor
def delete_device_alias(self, dev_alias):
+ self._info("delete_device_alias(dev_alias=%s)", dev_alias)
self.cursor.execute('UPDATE device SET alias=NULL WHERE alias=?', (dev_alias,))
-
+
@use_cursor
def delete_device_attribute(self, dev_name, attr_name):
dev_name = replace_wildcard(dev_name)
self.cursor.execute(\
'DELETE FROM property_attribute_device WHERE device LIKE ? AND ' \
'attribute LIKE ?', (dev_name, attr_name))
-
+
@use_cursor
def delete_device_attribute_property(self, dev_name, attr_name, prop_name):
cursor = self.cursor
@@ -283,7 +296,7 @@ class Tango_dbapi2(object):
cursor.execute(\
'DELETE FROM property_attribute_device WHERE device = ? AND '
'attribute = ? AND name = ?', (dev_name, attr_name, prop_name))
- # Mark this property as deleted
+ # Mark this property as deleted
hist_id = self.get_id("device_attribute", cursor=cursor)
cursor.execute(\
'INSERT INTO property_attribute_device_hist ' \
@@ -291,12 +304,12 @@ class Tango_dbapi2(object):
'(?, ?, ?, ?, "0", "DELETED")', (dev_name, attr_name, prop_name, hist_id))
self.purge_att_property("property_attribute_device_hist", "device",
dev_name, attr_name, prop_name, cursor=cursor)
-
+
@use_cursor
def delete_device_property(self, dev_name, prop_name):
cursor = self.cursor
prop_name = replace_wildcard(prop_name)
-
+
# Is there something to delete ?
cursor.execute(\
'SELECT DISTINCT name FROM property_device WHERE device=? AND ' \
@@ -317,7 +330,7 @@ class Tango_dbapi2(object):
def delete_property(self, obj_name, prop_name):
cursor = self.cursor
prop_name = replace_wildcard(prop_name)
-
+
# Is there something to delete ?
cursor.execute(\
'SELECT DISTINCT name FROM property WHERE object=? AND ' \
@@ -333,12 +346,12 @@ class Tango_dbapi2(object):
'INSERT INTO property_hist (object, name, id, count, value) ' \
'VALUES (?, ?, ?, "0", "DELETED")', (obj_name, row[0], hist_id))
self.purge_property("property_hist", "object", obj_name, row[0])
-
+
@use_cursor
def delete_server(self, server_instance):
cursor = self.cursor
server_instance = replace_wildcard(server_instance)
-
+
previous_host = None
# get host where running
if self.fire_to_starter:
@@ -347,7 +360,7 @@ class Tango_dbapi2(object):
# then delete the device from the device table
cursor.execute('DELETE FROM device WHERE server LIKE ?', (server_instance,))
-
+
# Update host's starter to update controlled servers list
if self.fire_to_starter and previous_host:
# TODO send to starter
@@ -359,6 +372,8 @@ class Tango_dbapi2(object):
@use_cursor
def export_device(self, dev_name, IOR, host, pid, version):
+ self._info("export_device(dev_name=%s, IOR=%s, host=%s, pid=%s, version=%s)",
+ dev_name, IOR, host, pid, version)
cursor = self.cursor
do_fire = False
previous_host = None
@@ -372,66 +387,131 @@ class Tango_dbapi2(object):
"device " + dev_name + " not defined in the database !",
"DataBase::ExportDevice()")
server = row[0]
-
+
# update the new value for this tuple
cursor.execute(\
'UPDATE device SET exported=1, ior=?, host=?, pid=?, version=?, ' \
'started=datetime("now") WHERE name LIKE ?',
(IOR, host, pid, version, dev_name))
-
+
# update host name in server table
- cursor.execute('UPDATE server SET host=?, WHERE name LIKE ?', (host, server))
-
+ cursor.execute('UPDATE server SET host=? WHERE name LIKE ?', (host, server))
+
if do_fire:
# TODO send to starter
pass
-
+
@use_cursor
- def export_event(self, event, IOR, host, pid, version):
+ def export_event(self, event, IOR, host, pid, version):
cursor = self.cursor
cursor.execute(\
'INSERT event (name,exported,ior,host,server,pid,version,started) ' \
'VALUES (?, 1, ?, ?, ?, ?, ?, datetime("now")',
(event, IOR, host, event, pid, version))
-
+
@use_cursor
def get_alias_device(self, dev_alias):
cursor = self.cursor
- cursor.execute('SELECT name FROM device WHERE alias LIKE ?', (dev_alias,))
+ cursor.execute('SELECT name FROM device WHERE alias LIKE ?',
+ (dev_alias,))
row = cursor.fetchone()
if row is None:
th_exc(DB_DeviceNotDefined,
"No device found for alias '" + dev_alias + "'",
"DataBase::GetAliasDevice()")
- return row[0]
-
+ return row[0]
+
@use_cursor
def get_attribute_alias(self, attr_alias):
cursor = self.cursor
- cursor.execute('SELECT name from attribute_alias WHERE alias LIKE ?', (attr_alias,))
+ cursor.execute('SELECT name from attribute_alias WHERE alias LIKE ?',
+ (attr_alias,))
row = cursor.fetchone()
if row is None:
th_exc(DB_SQLError,
"No attribute found for alias '" + attr_alias + "'",
- "DataBase::GetAttributeAlias()")
+ "DataBase::GetAttributeAlias()")
return row[0]
-
+
@use_cursor
def get_attribute_alias_list(self, attr_alias):
cursor = self.cursor
- cursor.execute('SELECT DISTINCT alias FROM attribute_alias WHERE alias LIKE ? ORDER BY attribute', (attr_alias,))
+ cursor.execute('SELECT DISTINCT alias FROM attribute_alias WHERE alias LIKE ? ORDER BY attribute',
+ (attr_alias,))
+ return [ row[0] for row in cursor.fetchall() ]
+
+ @use_cursor
+ def get_class_attribute_list(self, class_name, wildcard):
+ cursor = self.cursor
+ cursor.execute('SELECT DISTINCT attribute FROM property_attribute_class WHERE class=? and attribute like ?',
+ (class_name, wildcard))
+ return [ row[0] for row in cursor.fetchall() ]
+
+ @use_cursor
+ def get_class_attribute_property(self, clas_name, attributes):
+ cursor = self.cursor
+ stmt = 'SELECT name,value FROM property_attribute_class WHERE class=? AND attribute LIKE ?'
+ result = [class_name, str(len(attributes))]
+ for attribute in attributes:
+ cursor.execute(stmt, (class_name, attribute))
+ rows = cursor.fetchall()
+ result.append(attribute)
+ result.append(str(len(rows)))
+ for row in rows:
+ result.append(row[0])
+ result.append(row[1])
+ return result
+
+ @use_cursor
+ def get_class_attribute_property2(self, clas_name, attributes):
+ cursor = self.cursor
+ stmt = 'SELECT name,value FROM property_attribute_class WHERE class=? AND attribute LIKE ? ORDER BY name,count'
+ result = [class_name, str(len(attributes))]
+ # TODO: NOT DONE YET!
+ for attribute in attributes:
+ cursor.execute(stmt, (class_name, attribute))
+ rows = cursor.fetchall()
+ result.append(attribute)
+ result.append(str(len(rows)))
+ for row in rows:
+ result.append(row[0])
+ result.append(row[1])
+ return result
+
+ @use_cursor
+ def get_class_for_device(self, dev_name):
+ cursor = self.cursor
+ cursor.execute('SELECT DISTINCT class FROM device WHERE name=?', (dev_name,))
+ row = cursor.fetchone()
+ if row is None:
+ th_exc(DB_IncorrectArguments, "Class not found for " + dev_name,
+ "Database.GetClassForDevice")
+ return row
+
+ @use_cursor
+ def get_class_inheritance_for_device(self, dev_name):
+ cursor = self.cursor
+ class_name = self.get_class_for_device(dev_name, cursor=cursor)
+ props = self.get_class_property(class_name, "InheritedFrom", cursor=cursor)
+ return [class_name] + props[4:]
+
+ @use_cursor
+ def get_class_list(self, server):
+ cursor = self.cursor
+ cursor.execute('SELECT DISTINCT class FROM device WHERE class LIKE ? ORDER BY class', (server,))
return [ row[0] for row in cursor.fetchall() ]
-
-
+
+
+
class Tango_sqlite3(Tango_dbapi2):
-
+
DB_API_NAME = 'sqlite3'
-
+
def main():
db = Tango_sqlite3()
- db.add_device("MyServer/my1", ("a/b/c", ("a","b","c")), "MyClass")
+ db.add_device("MyServer/my1", ("a/b/c", ("a", "b", "c")), "MyClass")
db.close_db()
-
+
if __name__ == "__main__":
main()
diff --git a/src/boost/python/db.py b/src/boost/python/db.py
index dad4d9a..68352d5 100644
--- a/src/boost/python/db.py
+++ b/src/boost/python/db.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
@@ -33,7 +21,7 @@ import collections
from ._PyTango import StdStringVector, Database, DbDatum, DbData, \
DbDevInfo, DbDevInfos, DbDevImportInfo, DbDevExportInfo, DbDevExportInfos, \
- DbHistory, DbServerInfo
+ DbHistory, DbServerInfo, DbServerData
from .utils import is_pure_str, is_non_str_seq, seq_2_StdStringVector, \
seq_2_DbDevInfos, seq_2_DbDevExportInfos, seq_2_DbData, DbData_2_dict
@@ -1008,6 +996,18 @@ def __doc_Database():
New in PyTango 3.0.4
""" )
+ document_method("get_device_service_list", """
+ get_device_service_list(self, dev_name) -> DbDatum
+
+ Query database for the list of services provided by the given device.
+
+ Parameters :
+ - dev_name : (str) device name
+ Return : DbDatum with the list of services
+
+ New in PyTango 8.1.0
+ """ )
+
document_method("register_service", """
register_service(self, serv_name, inst_name, dev_name) -> None
@@ -1080,6 +1080,30 @@ def __doc_Database():
Return : DbDevImportInfo
""" )
+ document_method("get_device_info", """
+ get_device_info(self, dev_name) -> DbDevFullInfo
+
+ Query the databse for the full info of the specified device.
+
+ Example :
+ dev_info = db.get_device_info('my/own/device')
+ print(dev_info.name)
+ print(dev_info.class_name)
+ print(dev_info.ds_full_name)
+ print(dev_info.exported)
+ print(dev_info.ior)
+ print(dev_info.version)
+ print(dev_info.pid)
+ print(dev_info.started_date)
+ print(dev_info.stopped_date)
+
+ Parameters :
+ - dev_name : (str) device name
+ Return : DbDevFullInfo
+
+ New in PyTango 8.1.0
+ """ )
+
document_method("export_device", """
export_device(self, dev_export) -> None
@@ -1179,6 +1203,9 @@ def __doc_Database():
Parameters :
- alias : (str) alias
Return : device name
+
+ .. deprecated:: 8.1.0
+ Use :meth:`~PyTango.Database.get_device_from_alias` instead
""" )
document_method("get_alias", """
@@ -1191,6 +1218,33 @@ def __doc_Database():
Return : alias
New in PyTango 3.0.4
+
+ .. deprecated:: 8.1.0
+ Use :meth:`~PyTango.Database.get_alias_from_device` instead
+ """ )
+
+ document_method("get_device_from_alias", """
+ get_device_from_alias(self, alias) -> str
+
+ Get the device name from an alias.
+
+ Parameters :
+ - alias : (str) alias
+ Return : device name
+
+ New in PyTango 8.1.0
+ """ )
+
+ document_method("get_alias_from_device", """
+ get_alias_from_device(self, alias) -> str
+
+ Get the device alias name from its name.
+
+ Parameters :
+ - alias : (str) device name
+ Return : alias
+
+ New in PyTango 8.1.0
""" )
document_method("get_device_alias_list", """
@@ -1320,6 +1374,21 @@ def __doc_Database():
Throws : ConnectionFailed, CommunicationFailed, DevFailed from device (DB_SQLError)
""" )
+ document_method("rename_server", """
+ rename_server(self, old_ds_name, new_ds_name) -> None
+
+ Rename a device server process.
+
+ Parameters :
+ - old_ds_name : (str) old name
+ - new_ds_name : (str) new name
+ Return : None
+
+ Throws : ConnectionFailed, CommunicationFailed, DevFailed from device (DB_SQLError)
+
+ New in PyTango 8.1.0
+ """ )
+
document_method("get_server_info", """
get_server_info(self, server) -> DbServerInfo
@@ -1874,8 +1943,39 @@ def __doc_Database():
Return : full attribute name
Throws : ConnectionFailed, CommunicationFailed, DevFailed from device (DB_SQLError)
+
+ .. deprecated:: 8.1.0
+ Use :meth:`~PyTango.Database.get_attribute_from_alias` instead
+ """ )
+
+ document_method("get_attribute_from_alias", """
+ get_attribute_from_alias(self, alias) -> str
+
+ Get the full attribute name from an alias.
+
+ Parameters :
+ - alias : (str) attribute alias
+ Return : full attribute name
+
+ Throws : ConnectionFailed, CommunicationFailed, DevFailed from device (DB_SQLError)
+
+ New in PyTango 8.1.0
""" )
+ document_method("get_alias_from_attribute", """
+ get_alias_from_attribute(self, attr_name) -> str
+
+ Get the attribute alias from the full attribute name.
+
+ Parameters :
+ - attr_name : (str) full attribute name
+ Return : attribute alias
+
+ Throws : ConnectionFailed, CommunicationFailed, DevFailed from device (DB_SQLError)
+
+ New in PyTango 8.1.0
+ """ )
+
document_method("get_attribute_alias_list", """
get_attribute_alias_list(self, filter) -> DbDatum
@@ -2084,6 +2184,57 @@ def __doc_DbServerInfo():
- mode : (str) mode
- level : (str) level"""
+def __doc_DbServerData():
+ def document_method(method_name, desc, append=True):
+ return __document_method(DbServerData, method_name, desc, append)
+
+ DbServerData.__doc__ = """\
+ A structure used for moving DS from one tango host to another.
+ Create a new instance by: DbServerData(<server name>, <server instance>)"""
+
+ document_method("get_name", """
+ get_name(self) -> str
+
+ Returns the full server name
+
+ Parameters : None
+ Return : (str) the full server name
+ """ )
+
+ document_method("put_in_database", """
+ put_in_database(self, tg_host) -> None
+
+ Store all the data related to the device server process in the
+ database specified by the input arg.
+
+ Parameters :
+ - tg_host : (str) The tango host for the new database
+ Return : None
+ """ )
+
+ document_method("already_exist", """
+ already_exist(self, tg_host) -> bool
+
+ Check if any of the device server process device(s) is already
+ defined in the database specified by the tango host given as input arg
+
+ Parameters :
+ - tg_host : (str) The tango host for the new database
+ Return : (str) True in case any of the device is already known. False otherwise
+ """ )
+
+ document_method("remove", """
+ remove(self) -> None
+ remove(self, tg_host) -> None
+
+ Remove device server process from a database.
+
+ Parameters :
+ - tg_host : (str) The tango host for the new database
+ Return : None
+ """ )
+
+
def db_init(doc=True):
__init_DbDatum()
if doc:
@@ -2097,4 +2248,5 @@ def db_init(doc=True):
__doc_DbDevInfo()
__doc_DbHistory()
__doc_DbServerInfo()
+ __doc_DbServerData()
diff --git a/src/boost/python/device_attribute.py b/src/boost/python/device_attribute.py
index 4859359..985de73 100644
--- a/src/boost/python/device_attribute.py
+++ b/src/boost/python/device_attribute.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
diff --git a/src/boost/python/device_class.py b/src/boost/python/device_class.py
index db2e4e6..f35eef4 100644
--- a/src/boost/python/device_class.py
+++ b/src/boost/python/device_class.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
diff --git a/src/boost/python/device_data.py b/src/boost/python/device_data.py
index edfed89..4efcaed 100644
--- a/src/boost/python/device_data.py
+++ b/src/boost/python/device_data.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
diff --git a/src/boost/python/device_proxy.py b/src/boost/python/device_proxy.py
index 47e431c..19223f8 100644
--- a/src/boost/python/device_proxy.py
+++ b/src/boost/python/device_proxy.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
@@ -27,25 +15,92 @@ This is an internal PyTango module.
from __future__ import with_statement
-__all__ = ["device_proxy_init"]
+__all__ = ["device_proxy_init", "get_device_proxy"]
__docformat__ = "restructuredtext"
import threading
+import collections
from ._PyTango import StdStringVector, DbData, DbDatum, AttributeInfo, \
AttributeInfoEx, AttributeInfoList, AttributeInfoListEx, DeviceProxy, \
__CallBackAutoDie, __CallBackPushEvent, EventType, DevFailed, Except, \
- ExtractAs
-from .utils import is_pure_str, is_non_str_seq, is_integer, \
- seq_2_StdStringVector, StdStringVector_2_seq, seq_2_DbData, DbData_2_dict
+ ExtractAs, GreenMode
+
+from .utils import is_pure_str, is_non_str_seq, is_integer
+from .utils import seq_2_StdStringVector, StdStringVector_2_seq
+from .utils import seq_2_DbData, DbData_2_dict
from .utils import document_method as __document_method
-import collections
-import numbers
+from .green import result, submit, green, get_green_mode
+
+
+def get_device_proxy(*args, **kwargs):
+ """get_device_proxy(self, dev_name, green_mode=None, wait=True, timeout=True) -> DeviceProxy
+ get_device_proxy(self, dev_name, need_check_acc, green_mode=None, wait=True, timeout=None) -> DeviceProxy
+
+ Returns a new :class:`~PyTango.DeviceProxy`.
+ There is no difference between using this function and the direct
+ :class:`~PyTango.DeviceProxy` constructor if you use the default kwargs.
+
+ The added value of this function becomes evident when you choose a green_mode
+ to be *Futures* or *Gevent*. The DeviceProxy constructor internally makes some
+ network calls which makes it *slow*. By using one of the *green modes* as
+ green_mode you are allowing other python code to be executed in a cooperative way.
+
+ .. note::
+ The timeout parameter has no relation with the tango device client side
+ timeout (gettable by :meth:`~PyTango.DeviceProxy.get_timeout_millis` and
+ settable through :meth:`~PyTango.DeviceProxy.set_timeout_millis`)
+
+ :param dev_name: the device name or alias
+ :type dev_name: str
+ :param need_check_acc: in first version of the function it defaults to True.
+ Determines if at creation time of DeviceProxy it should check
+ for channel access (rarely used)
+ :type need_check_acc: bool
+ :param green_mode: determines the mode of execution of the device (including
+ the way it is created). Defaults to the current global
+ green_mode (check :func:`~PyTango.get_green_mode` and
+ :func:`~PyTango.set_green_mode`)
+ :type green_mode: :obj:`~PyTango.GreenMode`
+ :param wait: whether or not to wait for result. If green_mode
+ Ignored when green_mode is Synchronous (always waits).
+ :type wait: bool
+ :param timeout: The number of seconds to wait for the result.
+ If None, then there is no limit on the wait time.
+ Ignored when green_mode is Synchronous or wait is False.
+ :type timeout: float
+ :returns:
+ if green_mode is Synchronous or wait is True:
+ :class:`~PyTango.DeviceProxy`
+ else if green_mode is Futures:
+ :class:`concurrent.futures.Future`
+ else if green_mode is Gevent:
+ :class:`gevent.event.AsynchResult`
+ :throws:
+ * a *DevFailed* if green_mode is Synchronous or wait is True
+ and there is an error creating the device.
+ * a *concurrent.futures.TimeoutError* if green_mode is Futures,
+ wait is False, timeout is not None and the time to create the device
+ has expired.
+ * a *gevent.timeout.Timeout* if green_mode is Gevent, wait is False,
+ timeout is not None and the time to create the device has expired.
+
+ New in PyTango 8.1.0
+ """
+ # we cannot use the green wrapper because it consumes the green_mode and we
+ # want to forward it to the DeviceProxy constructor
+ green_mode = kwargs.get('green_mode', get_green_mode())
+ wait = kwargs.pop('wait', True)
+ timeout = kwargs.pop('timeout', None)
+
+ d = submit(green_mode, DeviceProxy, *args, **kwargs)
+ return result(d, green_mode, wait=wait, timeout=timeout)
+
class __TangoInfo(object):
"""Helper class for when DeviceProxy.info() is not available"""
-
+
def __init__(self):
self.dev_class = self.dev_type = 'Device'
self.doc_url = 'http://www.esrf.fr/computing/cs/tango/tango_doc/ds_doc/'
@@ -63,6 +118,43 @@ def __check_read_attribute(dev_attr):
raise DevFailed(*dev_attr.get_err_stack())
return dev_attr
+def __DeviceProxy__init__(self, *args, **kwargs):
+ self.__dict__['_green_mode'] = kwargs.pop('green_mode', None)
+ self.__dict__['_executors'] = executors = {}
+ executors[GreenMode.Futures] = kwargs.pop('executor', None)
+ executors[GreenMode.Gevent] = kwargs.pop('threadpool', None)
+ return DeviceProxy.__init_orig__(self, *args, **kwargs)
+
+def __DeviceProxy__get_green_mode(self):
+ """Returns the green mode in use by this DeviceProxy.
+
+ :returns: the green mode in use by this DeviceProxy.
+ :rtype: GreenMode
+
+ .. seealso::
+ :func:`PyTango.get_green_mode`
+ :func:`PyTango.set_green_mode`
+
+ New in PyTango 8.1.0
+ """
+ gm = self._green_mode
+ if gm is None:
+ gm = get_green_mode()
+ return gm
+
+def __DeviceProxy__set_green_mode(self, green_mode=None):
+ """Sets the green mode to be used by this DeviceProxy
+ Setting it to None means use the global PyTango green mode
+ (see :func:`PyTango.get_green_mode`).
+
+ :param green_mode: the new green mode
+ :type green_mode: GreenMode
+
+ New in PyTango 8.1.0
+ """
+ self._green_mode = green_mode
+
+
def __DeviceProxy__refresh_cmd_cache(self):
cmd_list = self.command_list_query()
cmd_cache = {}
@@ -81,7 +173,7 @@ def __DeviceProxy__getattr(self, name):
# and the ugly trait_names could be removed.
if name[:2] == "__" or name == 'trait_names':
raise AttributeError(name)
-
+
name_l = name.lower()
cmd_info = None
if not hasattr(self, '__cmd_cache'):
@@ -93,28 +185,28 @@ def __DeviceProxy__getattr(self, name):
cmd_info = self.__cmd_cache[name_l]
except:
pass
-
+
if cmd_info is not None:
d, f = cmd_info
if f is None:
- doc = "%s(%s) -> %s\n\n" % (d.cmd_name, d.in_type, d.out_type)
+ doc = "%s(%s) -> %s\n\n" % (d.cmd_name, d.in_type, d.out_type)
doc += " - in (%s): %s\n" % (d.in_type, d.in_type_desc)
doc += " - out (%s): %s\n" % (d.out_type, d.out_type_desc)
- def f(*args,**kwds): return self.command_inout(name, *args, **kwds)
+ def f(*args, **kwds): return self.command_inout(name, *args, **kwds)
f.__doc__ = doc
self.__cmd_cache[name_l] = d, f
return f
-
+
find_attr = True
if not hasattr(self, '__attr_cache') or name_l not in self.__attr_cache:
try:
self.__refresh_attr_cache()
except:
find_attr = False
-
+
if not find_attr or name_l not in self.__attr_cache:
raise AttributeError(name)
-
+
return self.read_attribute(name).value
def __DeviceProxy__setattr(self, name, value):
@@ -123,7 +215,7 @@ def __DeviceProxy__setattr(self, name, value):
self.__refresh_attr_cache()
except:
return super(DeviceProxy, self).__setattr__(name, value)
-
+
if name.lower() in self.__attr_cache:
self.write_attribute(name, value)
else:
@@ -154,6 +246,12 @@ def __DeviceProxy__contains(self, key):
def __DeviceProxy__read_attribute(self, value, extract_as=ExtractAs.Numpy):
return __check_read_attribute(self._read_attribute(value, extract_as))
+#def __DeviceProxy__read_attribute(self, value, extract_as=ExtractAs.Numpy,
+# green_mode=None, wait=True, timeout=None):
+# green_mode, submit = submitable(green_mode)
+# result = submit(__DeviceProxy__read_attribute_raw, self, value, extract_as=extract_as)
+# return get_result(result, green_mode, wait=wait, timeout=timeout)
+
def __DeviceProxy__read_attributes_asynch(self, attr_names, cb=None, extract_as=ExtractAs.Numpy):
"""
read_attributes_asynch( self, attr_names) -> int
@@ -658,7 +756,7 @@ def __DeviceProxy__get_event_map(self):
self.__dict__['_subscribed_events'] = dict()
return self._subscribed_events
-def __DeviceProxy__subscribe_event ( self, attr_name, event_type, cb_or_queuesize, filters=[], stateless=False, extract_as=ExtractAs.Numpy):
+def __DeviceProxy__subscribe_event (self, attr_name, event_type, cb_or_queuesize, filters=[], stateless=False, extract_as=ExtractAs.Numpy):
"""
subscribe_event(self, attr_name, event, callback, filters=[], stateless=False, extract_as=Numpy) -> int
@@ -722,7 +820,7 @@ def __DeviceProxy__subscribe_event ( self, attr_name, event_type, cb_or_queuesiz
All other parameters are similar to the descriptions given in the
other subscribe_event() version.
"""
-
+
if isinstance(cb_or_queuesize, collections.Callable):
cb = __CallBackPushEvent()
cb.push_event = cb_or_queuesize
@@ -730,7 +828,7 @@ def __DeviceProxy__subscribe_event ( self, attr_name, event_type, cb_or_queuesiz
cb = __CallBackPushEvent()
cb.push_event = cb_or_queuesize.push_event
elif is_integer(cb_or_queuesize):
- cb = cb_or_queuesize # queuesize
+ cb = cb_or_queuesize # queuesize
else:
raise TypeError("Parameter cb_or_queuesize should be a number, a" + \
" callable object or an object with a 'push_event' method.")
@@ -818,15 +916,15 @@ def __DeviceProxy__get_events(self, event_id, callback=None, extract_as=ExtractA
queuesize, event_type, attr_name = self.__get_event_map().get(event_id, (None, None, None))
if event_type is None:
raise ValueError("Invalid event_id. You are not subscribed to event %s." % str(event_id))
- if event_type in [ EventType.CHANGE_EVENT,
- EventType.QUALITY_EVENT,
- EventType.PERIODIC_EVENT,
- EventType.ARCHIVE_EVENT,
- EventType.USER_EVENT ]:
+ if event_type in ( EventType.CHANGE_EVENT,
+ EventType.QUALITY_EVENT,
+ EventType.PERIODIC_EVENT,
+ EventType.ARCHIVE_EVENT,
+ EventType.USER_EVENT ):
return self.__get_data_events(event_id, extract_as)
- elif event_type in [ EventType.ATTR_CONF_EVENT ]:
+ elif event_type in (EventType.ATTR_CONF_EVENT,):
return self.__get_attr_conf_events(event_id, extract_as)
- elif event_type in [ EventType.DATA_READY_EVENT ]:
+ elif event_type in (EventType.DATA_READY_EVENT,):
return self.__get_data_ready_events(event_id, extract_as)
else:
assert (False)
@@ -859,7 +957,89 @@ def __DeviceProxy__str(self):
info = self._get_info_()
return "%s(%s)" % (info.dev_class, self.dev_name())
+def __DeviceProxy__read_attributes(self, *args, **kwargs):
+ return self._read_attributes(*args, **kwargs)
+
+def __DeviceProxy__write_attribute(self, *args, **kwargs):
+ return self._write_attribute(*args, **kwargs)
+
+def __DeviceProxy__write_attributes(self, *args, **kwargs):
+ return self._write_attributes(*args, **kwargs)
+
+def __DeviceProxy__ping(self, *args, **kwargs):
+ return self._ping(*args, **kwargs)
+
+def __DeviceProxy__state(self, *args, **kwargs):
+ """state(self) -> DevState
+
+ A method which returns the state of the device.
+
+ Parameters : None
+ Return : (DevState) constant
+ Example :
+ dev_st = dev.state()
+ if dev_st == DevState.ON : ...
+ """
+ return self._state(*args, **kwargs)
+
+def __DeviceProxy__status(self, *args, **kwargs):
+ """status(self) -> str
+
+ A method which returns the status of the device as a string.
+
+ Parameters : None
+ Return : (str) describing the device status
+ """
+ return self._status(*args, **kwargs)
+
+def __DeviceProxy__write_attribute_reply(self, *args, **kwargs):
+ """
+ write_attribute_reply(self, id) -> None
+
+ Check if the answer of an asynchronous write_attribute is arrived
+ (polling model). If the reply is arrived and if it is a valid reply,
+ the call returned. If the reply is an exception, it is re-thrown by
+ this call. An exception is also thrown in case of the reply is not
+ yet arrived.
+
+ Parameters :
+ - id : (int) the asynchronous call identifier.
+ Return : None
+
+ Throws : AsynCall, AsynReplyNotArrived, CommunicationFailed, DevFailed from device.
+
+ New in PyTango 7.0.0
+
+ write_attribute_reply(self, id, timeout) -> None
+
+ Check if the answer of an asynchronous write_attribute is arrived
+ (polling model). id is the asynchronous call identifier. If the
+ reply is arrived and if it is a valid reply, the call returned. If
+ the reply is an exception, it is re-thrown by this call. If the
+ reply is not yet arrived, the call will wait (blocking the process)
+ for the time specified in timeout. If after timeout milliseconds,
+ the reply is still not there, an exception is thrown. If timeout is
+ set to 0, the call waits until the reply arrived.
+
+ Parameters :
+ - id : (int) the asynchronous call identifier.
+ - timeout : (int) the timeout
+
+ Return : None
+
+ Throws : AsynCall, AsynReplyNotArrived, CommunicationFailed, DevFailed from device.
+
+ New in PyTango 7.0.0
+ """
+ return self.write_attributes_reply(*args, **kwargs)
+
def __init_DeviceProxy():
+ DeviceProxy.__init_orig__ = DeviceProxy.__init__
+ DeviceProxy.__init__ = __DeviceProxy__init__
+
+ DeviceProxy.get_green_mode = __DeviceProxy__get_green_mode
+ DeviceProxy.set_green_mode = __DeviceProxy__set_green_mode
+
DeviceProxy.__getattr__ = __DeviceProxy__getattr
DeviceProxy.__setattr__ = __DeviceProxy__setattr
DeviceProxy.__getitem__ = __DeviceProxy__getitem
@@ -871,14 +1051,22 @@ def __init_DeviceProxy():
DeviceProxy.__refresh_cmd_cache = __DeviceProxy__refresh_cmd_cache
DeviceProxy.__refresh_attr_cache = __DeviceProxy__refresh_attr_cache
- DeviceProxy.read_attribute = __DeviceProxy__read_attribute
+ DeviceProxy.ping = green(__DeviceProxy__ping)
+ DeviceProxy.state = green(__DeviceProxy__state)
+ DeviceProxy.status = green(__DeviceProxy__status)
+
+ DeviceProxy.read_attribute = green(__DeviceProxy__read_attribute)
+ DeviceProxy.read_attributes = green(__DeviceProxy__read_attributes)
+ DeviceProxy.write_attribute = green(__DeviceProxy__write_attribute)
+ DeviceProxy.write_attributes = green(__DeviceProxy__write_attributes)
+ DeviceProxy.write_read_attribute = green(__DeviceProxy__write_read_attribute)
+
DeviceProxy.read_attributes_asynch = __DeviceProxy__read_attributes_asynch
DeviceProxy.read_attribute_asynch = __DeviceProxy__read_attribute_asynch
DeviceProxy.read_attribute_reply = __DeviceProxy__read_attribute_reply
DeviceProxy.write_attributes_asynch = __DeviceProxy__write_attributes_asynch
DeviceProxy.write_attribute_asynch = __DeviceProxy__write_attribute_asynch
- DeviceProxy.write_attribute_reply = DeviceProxy.write_attributes_reply
- DeviceProxy.write_read_attribute = __DeviceProxy__write_read_attribute
+ DeviceProxy.write_attribute_reply = __DeviceProxy__write_attribute_reply
DeviceProxy.get_property = __DeviceProxy__get_property
DeviceProxy.put_property = __DeviceProxy__put_property
@@ -890,21 +1078,21 @@ def __init_DeviceProxy():
DeviceProxy.__get_event_map = __DeviceProxy__get_event_map
DeviceProxy.__get_event_map_lock = __DeviceProxy__get_event_map_lock
- DeviceProxy.subscribe_event = __DeviceProxy__subscribe_event
- DeviceProxy.unsubscribe_event = __DeviceProxy__unsubscribe_event
+ DeviceProxy.subscribe_event = green(__DeviceProxy__subscribe_event)
+ DeviceProxy.unsubscribe_event = green(__DeviceProxy__unsubscribe_event)
DeviceProxy.__unsubscribe_event_all = __DeviceProxy__unsubscribe_event_all
DeviceProxy.get_events = __DeviceProxy__get_events
DeviceProxy.__str__ = __DeviceProxy__str
DeviceProxy.__repr__ = __DeviceProxy__str
-
+
DeviceProxy._get_info_ = __DeviceProxy___get_info_
-
+
def __doc_DeviceProxy():
def document_method(method_name, desc, append=True):
return __document_method(DeviceProxy, method_name, desc, append)
- DeviceProxy.__doc__ = """
+ DeviceProxy.__doc__ = """\
DeviceProxy is the high level Tango object which provides the client with
an easy-to-use interface to TANGO devices. DeviceProxy provides interfaces
to all TANGO Device interfaces.The DeviceProxy manages timeouts, stateless
@@ -913,6 +1101,51 @@ def __doc_DeviceProxy():
Example :
dev = PyTango.DeviceProxy("sys/tg_test/1")
+
+ DeviceProxy(dev_name, green_mode=None, wait=True, timeout=True) -> DeviceProxy
+ DeviceProxy(self, dev_name, need_check_acc, green_mode=None, wait=True, timeout=True) -> DeviceProxy
+
+ Creates a new :class:`~PyTango.DeviceProxy`.
+
+ :param dev_name: the device name or alias
+ :type dev_name: str
+ :param need_check_acc: in first version of the function it defaults to True.
+ Determines if at creation time of DeviceProxy it should check
+ for channel access (rarely used)
+ :type need_check_acc: bool
+ :param green_mode: determines the mode of execution of the device (including.
+ the way it is created). Defaults to the current global
+ green_mode (check :func:`~PyTango.get_green_mode` and
+ :func:`~PyTango.set_green_mode`)
+ :type green_mode: :obj:`~PyTango.GreenMode`
+ :param wait: whether or not to wait for result. If green_mode
+ Ignored when green_mode is Synchronous (always waits).
+ :type wait: bool
+ :param timeout: The number of seconds to wait for the result.
+ If None, then there is no limit on the wait time.
+ Ignored when green_mode is Synchronous or wait is False.
+ :type timeout: float
+ :returns:
+ if green_mode is Synchronous or wait is True:
+ :class:`~PyTango.DeviceProxy`
+ elif green_mode is Futures:
+ :class:`concurrent.futures.Future`
+ elif green_mode is Gevent:
+ :class:`gevent.event.AsynchResult`
+ :throws:
+ * :class:`~PyTango.DevFailed` if green_mode is Synchronous or wait is True
+ and there is an error creating the device.
+ * :class:`concurrent.futures.TimeoutError` if green_mode is Futures,
+ wait is False, timeout is not None and the time to create the device
+ has expired.
+ * :class:`gevent.timeout.Timeout` if green_mode is Gevent, wait is False,
+ timeout is not None and the time to create the device has expired.
+
+ .. versionadded:: 8.1.0
+ *green_mode* parameter.
+ *wait* parameter.
+ *timeout* parameter.
+
"""
#-------------------------------------
@@ -937,7 +1170,7 @@ def __doc_DeviceProxy():
All DeviceInfo fields are strings except for the server_version
which is an integer"
- """ )
+ """)
document_method("get_device_db", """
get_device_db(self) -> Database
@@ -948,28 +1181,7 @@ def __doc_DeviceProxy():
Return : (Database) object
New in PyTango 7.0.0
- """ )
-
- document_method("status", """
- status(self) -> str
-
- A method which returns the status of the device as a string.
-
- Parameters : None
- Return : (str) describing the device status
- """ )
-
- document_method("state", """
- state(self) -> DevState
-
- A method which returns the state of the device.
-
- Parameters : None
- Return : (DevState) constant
- Example :
- dev_st = dev.state()
- if dev_st == DevState.ON : ...
- """ )
+ """)
document_method("adm_name", """
adm_name(self) -> str
@@ -979,7 +1191,7 @@ def __doc_DeviceProxy():
server, e.g restart it
New in PyTango 3.0.4
- """ )
+ """)
document_method("description", """
description(self) -> str
@@ -988,20 +1200,34 @@ def __doc_DeviceProxy():
Parameters : None
Return : (str) describing the device
- """ )
+ """)
document_method("name", """
name(self) -> str
Return the device name from the device itself.
- """ )
+ """)
document_method("alias", """
alias(self) -> str
Return the device alias if one is defined.
Otherwise, throws exception.
- """ )
+
+ Return : (str) device alias
+ """)
+
+ document_method("get_tango_lib_version", """
+ get_tango_lib_version(self) -> int
+
+ Returns the Tango lib version number used by the remote device
+ Otherwise, throws exception.
+
+ Return : (int) The device Tango lib version as a 3 or 4 digits number.
+ Possible return value are: 100,200,500,520,700,800,810,...
+
+ New in PyTango 8.1.0
+ """)
document_method("ping", """
ping(self) -> int
@@ -1009,9 +1235,9 @@ def __doc_DeviceProxy():
A method which sends a ping to the device
Parameters : None
- Return : (int) time elapsed in milliseconds
+ Return : (int) time elapsed in microseconds
Throws : exception if device is not alive
- """ )
+ """)
document_method("black_box", """
black_box(self, n) -> sequence<str>
@@ -1025,7 +1251,7 @@ def __doc_DeviceProxy():
was executed
Example :
print(black_box(4))
- """ )
+ """)
#-------------------------------------
# Device methods
@@ -1051,7 +1277,7 @@ def __doc_DeviceProxy():
print(com_info.disp_level)
See CommandInfo documentation string form more detail
- """ )
+ """)
document_method("command_list_query", """
command_list_query(self) -> sequence<CommandInfo>
@@ -1060,7 +1286,7 @@ def __doc_DeviceProxy():
Parameters : None
Return : (CommandInfoList) Sequence of CommandInfo objects
- """ )
+ """)
document_method("import_info", """
import_info(self) -> DbDevImportInfo
@@ -1078,7 +1304,7 @@ def __doc_DeviceProxy():
All DbDevImportInfo fields are strings except for exported which
is an integer"
- """ )
+ """)
#-------------------------------------
# Property methods
@@ -1101,7 +1327,7 @@ def __doc_DeviceProxy():
Throws : ConnectionFailed, CommunicationFailed,
DevFailed from device
- """ )
+ """)
# get_attribute_config -> in code
# get_attribute_config_ex -> in code
@@ -1118,7 +1344,7 @@ def __doc_DeviceProxy():
Throws : ConnectionFailed, CommunicationFailed,
DevFailed from device
- """ )
+ """)
document_method("attribute_list_query", """
attribute_list_query(self) -> sequence<AttributeInfo>
@@ -1132,7 +1358,7 @@ def __doc_DeviceProxy():
Throws : ConnectionFailed, CommunicationFailed,
DevFailed from device
- """ )
+ """)
document_method("attribute_list_query_ex", """
attribute_list_query_ex(self) -> sequence<AttributeInfoEx>
@@ -1146,21 +1372,34 @@ def __doc_DeviceProxy():
Throws : ConnectionFailed, CommunicationFailed,
DevFailed from device
- """ )
+ """)
# set_attribute_config -> in code
document_method("read_attribute", """
- read_attribute(self, attr_name, extract_as=ExtractAs.Numpy) -> DeviceAttribute
+ read_attribute(self, attr_name, extract_as=ExtractAs.Numpy, green_mode=None, wait=True, timeout=None) -> DeviceAttribute
Read a single attribute.
Parameters :
- attr_name : (str) The name of the attribute to read.
- extract_as : (ExtractAs) Defaults to numpy.
+ - green_mode : (GreenMode) Defaults to the current DeviceProxy GreenMode.
+ (see :meth:`~PyTango.DeviceProxy.get_green_mode` and
+ :meth:`~PyTango.DeviceProxy.set_green_mode`).
+ - wait : (bool) whether or not to wait for result. If green_mode
+ is *Synchronous*, this parameter is ignored as it always
+ waits for the result.
+ Ignored when green_mode is Synchronous (always waits).
+ - timeout : (float) The number of seconds to wait for the result.
+ If None, then there is no limit on the wait time.
+ Ignored when green_mode is Synchronous or wait is False.
+
Return : (DeviceAttribute)
Throws : ConnectionFailed, CommunicationFailed, DevFailed from device
+ TimeoutError (green_mode == Futures) If the future didn't finish executing before the given timeout.
+ Timeout (green_mode == Gevent) If the async result didn't finish executing before the given timeout.
.. versionchanged:: 7.1.4
For DevEncoded attributes, before it was returning a DeviceAttribute.value
@@ -1175,50 +1414,107 @@ def __doc_DeviceProxy():
in which case it returns **(format<str>, data<str>)**. Carefull, if
using python >= 3 data<str> is decoded using default python
*utf-8* encoding. This means that PyTango assumes tango DS was written
- encapsulating string into *utf-8* which is the default python enconding.
- """ )
+ encapsulating string into *utf-8* which is the default python encoding.
+
+ .. versionadded:: 8.1.0
+ *green_mode* parameter.
+ *wait* parameter.
+ *timeout* parameter.
+ """)
document_method("read_attributes", """
- read_attributes(self, attr_names, extract_as=ExtractAs.Numpy) -> sequence<DeviceAttribute>
+ read_attributes(self, attr_names, extract_as=ExtractAs.Numpy, green_mode=None, wait=True, timeout=None) -> sequence<DeviceAttribute>
- Read the list of specified attributes.
+ Read the list of specified attributes.
- Parameters :
- - attr_names : (sequence<str>) A list of attributes to read.
- - extract_as : (ExtractAs) Defaults to numpy.
- Return : (sequence<DeviceAttribute>)
+ Parameters :
+ - attr_names : (sequence<str>) A list of attributes to read.
+ - extract_as : (ExtractAs) Defaults to numpy.
+ - green_mode : (GreenMode) Defaults to the current DeviceProxy GreenMode.
+ (see :meth:`~PyTango.DeviceProxy.get_green_mode` and
+ :meth:`~PyTango.DeviceProxy.set_green_mode`).
+ - wait : (bool) whether or not to wait for result. If green_mode
+ is *Synchronous*, this parameter is ignored as it always
+ waits for the result.
+ Ignored when green_mode is Synchronous (always waits).
+ - timeout : (float) The number of seconds to wait for the result.
+ If None, then there is no limit on the wait time.
+ Ignored when green_mode is Synchronous or wait is False.
+
+ Return : (sequence<DeviceAttribute>)
- Throws : ConnectionFailed, CommunicationFailed, DevFailed from device
- """ )
+ Throws : ConnectionFailed, CommunicationFailed, DevFailed from device
+ TimeoutError (green_mode == Futures) If the future didn't finish executing before the given timeout.
+ Timeout (green_mode == Gevent) If the async result didn't finish executing before the given timeout.
- document_method("write_attribute", """
- write_attribute(self, attr_name, value) -> None
- write_attribute(self, attr_info, value) -> None
+ .. versionadded:: 8.1.0
+ *green_mode* parameter.
+ *wait* parameter.
+ *timeout* parameter.
+ """)
- Write a single attribute.
+ document_method("write_attribute", """
+ write_attribute(self, attr_name, value, green_mode=None, wait=True, timeout=None) -> None
+ write_attribute(self, attr_info, value, green_mode=None, wait=True, timeout=None) -> None
- Parameters :
- - attr_name : (str) The name of the attribute to write.
- - attr_info : (AttributeInfo)
- - value : The value. For non SCALAR attributes it may be any sequence of sequences.
+ Write a single attribute.
- Throws : ConnectionFailed, CommunicationFailed, DeviceUnlocked, DevFailed from device
- """ )
+ Parameters :
+ - attr_name : (str) The name of the attribute to write.
+ - attr_info : (AttributeInfo)
+ - value : The value. For non SCALAR attributes it may be any sequence of sequences.
+ - green_mode : (GreenMode) Defaults to the current DeviceProxy GreenMode.
+ (see :meth:`~PyTango.DeviceProxy.get_green_mode` and
+ :meth:`~PyTango.DeviceProxy.set_green_mode`).
+ - wait : (bool) whether or not to wait for result. If green_mode
+ is *Synchronous*, this parameter is ignored as it always
+ waits for the result.
+ Ignored when green_mode is Synchronous (always waits).
+ - timeout : (float) The number of seconds to wait for the result.
+ If None, then there is no limit on the wait time.
+ Ignored when green_mode is Synchronous or wait is False.
+
+ Throws : ConnectionFailed, CommunicationFailed, DeviceUnlocked, DevFailed from device
+ TimeoutError (green_mode == Futures) If the future didn't finish executing before the given timeout.
+ Timeout (green_mode == Gevent) If the async result didn't finish executing before the given timeout.
+
+ .. versionadded:: 8.1.0
+ *green_mode* parameter.
+ *wait* parameter.
+ *timeout* parameter.
+ """)
document_method("write_attributes", """
- write_attributes(self, name_val) -> None
+ write_attributes(self, name_val, green_mode=None, wait=True, timeout=None) -> None
Write the specified attributes.
Parameters :
- name_val: A list of pairs (attr_name, value). See write_attribute
+ - green_mode : (GreenMode) Defaults to the current DeviceProxy GreenMode.
+ (see :meth:`~PyTango.DeviceProxy.get_green_mode` and
+ :meth:`~PyTango.DeviceProxy.set_green_mode`).
+ - wait : (bool) whether or not to wait for result. If green_mode
+ is *Synchronous*, this parameter is ignored as it always
+ waits for the result.
+ Ignored when green_mode is Synchronous (always waits).
+ - timeout : (float) The number of seconds to wait for the result.
+ If None, then there is no limit on the wait time.
+ Ignored when green_mode is Synchronous or wait is False.
Throws : ConnectionFailed, CommunicationFailed, DeviceUnlocked,
DevFailed or NamedDevFailedList from device
- """ )
+ TimeoutError (green_mode == Futures) If the future didn't finish executing before the given timeout.
+ Timeout (green_mode == Gevent) If the async result didn't finish executing before the given timeout.
+
+ .. versionadded:: 8.1.0
+ *green_mode* parameter.
+ *wait* parameter.
+ *timeout* parameter.
+ """)
document_method("write_read_attribute", """
- write_read_attribute(self, attr_name, value, extract_as=ExtractAs.Numpy) -> DeviceAttribute
+ write_read_attribute(self, attr_name, value, extract_as=ExtractAs.Numpy, green_mode=None, wait=True, timeout=None) -> DeviceAttribute
Write then read a single attribute in a single network call.
By default (serialisation by device), the execution of this call in
@@ -1229,9 +1525,16 @@ def __doc_DeviceProxy():
Throws : ConnectionFailed, CommunicationFailed, DeviceUnlocked,
DevFailed from device, WrongData
+ TimeoutError (green_mode == Futures) If the future didn't finish executing before the given timeout.
+ Timeout (green_mode == Gevent) If the async result didn't finish executing before the given timeout.
New in PyTango 7.0.0
- """ )
+
+ .. versionadded:: 8.1.0
+ *green_mode* parameter.
+ *wait* parameter.
+ *timeout* parameter.
+ """)
#-------------------------------------
# History methods
@@ -1249,7 +1552,7 @@ def __doc_DeviceProxy():
Throws : NonSupportedFeature, ConnectionFailed,
CommunicationFailed, DevFailed from device
- """ )
+ """)
document_method("attribute_history", """
attribute_history(self, attr_name, depth, extract_as=ExtractAs.Numpy) -> sequence<DeviceAttributeHistory>
@@ -1266,7 +1569,7 @@ def __doc_DeviceProxy():
Throws : NonSupportedFeature, ConnectionFailed,
CommunicationFailed, DevFailed from device
- """ )
+ """)
#-------------------------------------
# Polling administration methods
@@ -1288,7 +1591,7 @@ def __doc_DeviceProxy():
- time since data in the ring buffer has not been updated
- delta time between the last records in the ring buffer
- exception parameters in case of the last execution failed
- """ )
+ """)
document_method("poll_command", """
poll_command(self, cmd_name, period) -> None
@@ -1299,7 +1602,7 @@ def __doc_DeviceProxy():
- cmd_name : (str) command name
- period : (int) polling period in milliseconds
Return : None
- """ )
+ """)
document_method("poll_attribute", """
poll_attribute(self, attr_name, period) -> None
@@ -1310,7 +1613,7 @@ def __doc_DeviceProxy():
- attr_name : (str) attribute name
- period : (int) polling period in milliseconds
Return : None
- """ )
+ """)
document_method("get_command_poll_period", """
get_command_poll_period(self, cmd_name) -> int
@@ -1320,7 +1623,7 @@ def __doc_DeviceProxy():
Parameters :
- cmd_name : (str) command name
Return : polling period in milliseconds
- """ )
+ """)
document_method("get_attribute_poll_period", """
get_attribute_poll_period(self, attr_name) -> int
@@ -1330,7 +1633,7 @@ def __doc_DeviceProxy():
Parameters :
- attr_name : (str) attribute name
Return : polling period in milliseconds
- """ )
+ """)
document_method("is_command_polled", """
is_command_polled(self, cmd_name) -> bool
@@ -1340,7 +1643,7 @@ def __doc_DeviceProxy():
Parameters :
- cmd_name : (str) command name
Return : boolean value
- """ )
+ """)
document_method("is_attribute_polled", """
is_attribute_polled(self, attr_name) -> bool
@@ -1350,7 +1653,7 @@ def __doc_DeviceProxy():
Parameters :
- attr_name : (str) attribute name
Return : boolean value
- """ )
+ """)
document_method("stop_poll_command", """
stop_poll_command(self, cmd_name) -> None
@@ -1360,7 +1663,7 @@ def __doc_DeviceProxy():
Parameters :
- cmd_name : (str) command name
Return : None
- """ )
+ """)
document_method("stop_poll_attribute", """
stop_poll_attribute(self, attr_name) -> None
@@ -1370,7 +1673,7 @@ def __doc_DeviceProxy():
Parameters :
- attr_name : (str) attribute name
Return : None
- """ )
+ """)
#-------------------------------------
# Asynchronous methods
@@ -1421,7 +1724,7 @@ def __doc_DeviceProxy():
CommunicationFailed, DevFailed from device
New in PyTango 7.0.0
- """ )
+ """)
document_method("pending_asynch_call", """
pending_asynch_call(self) -> int
@@ -1429,7 +1732,7 @@ def __doc_DeviceProxy():
Return number of device asynchronous pending requests"
New in PyTango 7.0.0
- """ )
+ """)
# write_attributes_asynch -> in code
@@ -1470,46 +1773,7 @@ def __doc_DeviceProxy():
Throws : AsynCall, AsynReplyNotArrived, CommunicationFailed, DevFailed from device.
New in PyTango 7.0.0
- """ )
-
- document_method("write_attribute_reply", """
- write_attribute_reply(self, id) -> None
-
- Check if the answer of an asynchronous write_attribute is arrived
- (polling model). If the reply is arrived and if it is a valid reply,
- the call returned. If the reply is an exception, it is re-thrown by
- this call. An exception is also thrown in case of the reply is not
- yet arrived.
-
- Parameters :
- - id : (int) the asynchronous call identifier.
- Return : None
-
- Throws : AsynCall, AsynReplyNotArrived, CommunicationFailed, DevFailed from device.
-
- New in PyTango 7.0.0
-
- write_attribute_reply(self, id, timeout) -> None
-
- Check if the answer of an asynchronous write_attribute is arrived
- (polling model). id is the asynchronous call identifier. If the
- reply is arrived and if it is a valid reply, the call returned. If
- the reply is an exception, it is re-thrown by this call. If the
- reply is not yet arrived, the call will wait (blocking the process)
- for the time specified in timeout. If after timeout milliseconds,
- the reply is still not there, an exception is thrown. If timeout is
- set to 0, the call waits until the reply arrived.
-
- Parameters :
- - id : (int) the asynchronous call identifier.
- - timeout : (int) the timeout
-
- Return : None
-
- Throws : AsynCall, AsynReplyNotArrived, CommunicationFailed, DevFailed from device.
-
- New in PyTango 7.0.0
- """ )
+ """)
#-------------------------------------
# Logging administration methods
@@ -1538,7 +1802,7 @@ def __doc_DeviceProxy():
Throws : DevFailed from device
New in PyTango 7.0.0
- """ )
+ """)
document_method("remove_logging_target", """
remove_logging_target(self, target_type_target_name) -> None
@@ -1562,7 +1826,7 @@ def __doc_DeviceProxy():
Return : None
New in PyTango 7.0.0
- """ )
+ """)
document_method("get_logging_target", """
get_logging_target(self) -> sequence<str>
@@ -1576,7 +1840,7 @@ def __doc_DeviceProxy():
Return : a squence<str> with the logging targets
New in PyTango 7.0.0
- """ )
+ """)
document_method("get_logging_level", """
get_logging_level(self) -> int
@@ -1593,7 +1857,7 @@ def __doc_DeviceProxy():
Return : (int) representing the current logging level
New in PyTango 7.0.0
- """ )
+ """)
document_method("set_logging_level", """
set_logging_level(self, (int)level) -> None
@@ -1611,7 +1875,7 @@ def __doc_DeviceProxy():
Return : None
New in PyTango 7.0.0
- """ )
+ """)
#-------------------------------------
# Event methods
@@ -1637,7 +1901,7 @@ def __doc_DeviceProxy():
Throws : EventSystemFailed
New in PyTango 7.0.0
- """ )
+ """)
document_method("get_last_event_date", """
get_last_event_date(self, event_id) -> TimeVal
@@ -1656,7 +1920,7 @@ def __doc_DeviceProxy():
Throws : EventSystemFailed
New in PyTango 7.0.0
- """ )
+ """)
document_method("is_event_queue_empty", """
is_event_queue_empty(self, event_id) -> bool
@@ -1673,7 +1937,7 @@ def __doc_DeviceProxy():
Throws : EventSystemFailed
New in PyTango 7.0.0
- """ )
+ """)
#-------------------------------------
# Locking methods
@@ -1718,7 +1982,7 @@ def __doc_DeviceProxy():
Return : None
New in PyTango 7.0.0
- """ )
+ """)
document_method("unlock", """
unlock(self, (bool)force) -> None
@@ -1737,7 +2001,7 @@ def __doc_DeviceProxy():
Return : None
New in PyTango 7.0.0
- """ )
+ """)
document_method("locking_status", """
locking_status(self) -> str
@@ -1758,7 +2022,7 @@ def __doc_DeviceProxy():
Return : a string representing the current locking status
New in PyTango 7.0.0"
- """ )
+ """)
document_method("is_locked", """
is_locked(self) -> bool
@@ -1769,7 +2033,7 @@ def __doc_DeviceProxy():
Return : (bool) True if the device is locked. Otherwise, False
New in PyTango 7.0.0
- """ )
+ """)
document_method("is_locked_by_me", """
is_locked_by_me(self) -> bool
@@ -1782,7 +2046,7 @@ def __doc_DeviceProxy():
Otherwise, False
New in PyTango 7.0.0
- """ )
+ """)
document_method("get_locker", """
get_locker(self, lockinfo) -> bool
@@ -1798,7 +2062,7 @@ def __doc_DeviceProxy():
Otherwise, False
New in PyTango 7.0.0
- """ )
+ """)
def device_proxy_init(doc=True):
__init_DeviceProxy()
diff --git a/src/boost/python/device_server.py b/src/boost/python/device_server.py
index 8c05fa5..e19cb5b 100644
--- a/src/boost/python/device_server.py
+++ b/src/boost/python/device_server.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
diff --git a/src/boost/python/encoded_attribute.py b/src/boost/python/encoded_attribute.py
index d23d784..ca39bdd 100644
--- a/src/boost/python/encoded_attribute.py
+++ b/src/boost/python/encoded_attribute.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
@@ -44,7 +32,7 @@ if constants.NUMPY_SUPPORT:
np = None
else:
np = None
-
+
_allowed_extract = ExtractAs.Numpy, ExtractAs.String, ExtractAs.Tuple, \
ExtractAs.List
@@ -81,7 +69,7 @@ def __EncodedAttribute_encode_jpeg_gray8(self, gray8, width=0, height=0, quality
data = numpy.arange(100, dtype=numpy.byte)
data = numpy.array((data,data,data))
enc.encode_jpeg_gray8(data)
- attr.set_value(data)
+ attr.set_value(enc)
"""
self._generic_encode_gray8(gray8, width=width, height=height, quality=quality, format=_ImageFormat.JpegImage)
@@ -116,7 +104,7 @@ def __EncodedAttribute_encode_gray8(self, gray8, width=0, height=0):
data = numpy.arange(100, dtype=numpy.byte)
data = numpy.array((data,data,data))
enc.encode_gray8(data)
- attr.set_value(data)
+ attr.set_value(enc)
"""
self._generic_encode_gray8(gray8, width=width, height=height, format=_ImageFormat.RawImage)
@@ -125,19 +113,19 @@ def __EncodedAttribute_generic_encode_gray8(self, gray8, width=0, height=0, qual
if not is_seq(gray8):
raise TypeError("Expected sequence (str, numpy.ndarray, list, tuple "
"or bytearray) as first argument")
-
+
is_str = is_pure_str(gray8)
if is_str:
if not width or not height:
raise ValueError("When giving a string as data, you must also "
"supply width and height")
-
+
if np and isinstance(gray8, np.ndarray):
if gray8.ndim != 2:
if not width or not height:
raise ValueError("When giving a non 2D numpy array, width and "
"height must be supplied")
- if gray8.nbytes != width*height:
+ if gray8.nbytes != width * height:
raise ValueError("numpy array size mismatch")
else:
if gray8.itemsize != 1:
@@ -153,7 +141,7 @@ def __EncodedAttribute_generic_encode_gray8(self, gray8, width=0, height=0, qual
height = len(gray8)
if height < 1:
raise IndexError("Expected sequence with at least one row")
-
+
row0 = gray8[0]
if not is_seq(row0):
raise IndexError("Expected sequence (str, numpy.ndarray, list, tuple or "
@@ -196,25 +184,25 @@ def __EncodedAttribute_encode_gray16(self, gray16, width=0, height=0):
data = numpy.arange(100, dtype=numpy.int16)
data = numpy.array((data,data,data))
enc.encode_gray16(data)
- attr.set_value(data)
+ attr.set_value(enc)
"""
if not is_seq(gray16):
raise TypeError("Expected sequence (str, numpy.ndarray, list, tuple "
"or bytearray) as first argument")
-
+
is_str = is_pure_str(gray16)
if is_str:
if not width or not height:
raise ValueError("When giving a string as data, you must also "
"supply width and height")
-
-
+
+
if np and isinstance(gray16, np.ndarray):
if gray16.ndim != 2:
if not width or not height:
raise ValueError("When giving a non 2D numpy array, width and "
"height must be supplied")
- if gray16.nbytes/2 != width*height:
+ if gray16.nbytes / 2 != width * height:
raise ValueError("numpy array size mismatch")
else:
if gray16.itemsize != 2:
@@ -225,12 +213,12 @@ def __EncodedAttribute_encode_gray16(self, gray16, width=0, height=0):
if gray16.flags.aligned != True:
raise TypeError("Currently, only contiguous, aligned numpy arrays "
"are supported")
-
+
if not is_str and (not width or not height):
height = len(gray16)
if height < 1:
raise IndexError("Expected sequence with at least one row")
-
+
row0 = gray16[0]
if not is_seq(row0):
raise IndexError("Expected sequence (str, numpy.ndarray, list, tuple or "
@@ -238,7 +226,7 @@ def __EncodedAttribute_encode_gray16(self, gray16, width=0, height=0):
width = len(row0)
if is_pure_str(row0) or type(row0) == bytearray:
width /= 2
-
+
self._encode_gray16(gray16, width, height)
def __EncodedAttribute_encode_jpeg_rgb24(self, rgb24, width=0, height=0, quality=100.0):
@@ -275,7 +263,7 @@ def __EncodedAttribute_encode_jpeg_rgb24(self, rgb24, width=0, height=0, quality
# create an 'image' where each pixel is R=0x01, G=0x01, B=0x01
arr = numpy.ones((10,10,3), dtype=numpy.uint8)
enc.encode_jpeg_rgb24(data)
- attr.set_value(data)
+ attr.set_value(enc)
"""
self._generic_encode_rgb24(rgb24, width=width, height=height, quality=quality, format=_ImageFormat.JpegImage)
@@ -311,28 +299,28 @@ def __EncodedAttribute_encode_rgb24(self, rgb24, width=0, height=0):
# create an 'image' where each pixel is R=0x01, G=0x01, B=0x01
arr = numpy.ones((10,10,3), dtype=numpy.uint8)
enc.encode_rgb24(data)
- attr.set_value(data)
+ attr.set_value(enc)
"""
self._generic_encode_rgb24(rgb24, width=width, height=height, format=_ImageFormat.RawImage)
-
+
def __EncodedAttribute_generic_encode_rgb24(self, rgb24, width=0, height=0, quality=0, format=_ImageFormat.RawImage):
"""Internal usage only"""
if not is_seq(rgb24):
raise TypeError("Expected sequence (str, numpy.ndarray, list, tuple "
"or bytearray) as first argument")
-
+
is_str = is_pure_str(rgb24)
if is_str:
if not width or not height:
raise ValueError("When giving a string as data, you must also "
"supply width and height")
-
+
if np and isinstance(rgb24, np.ndarray):
if rgb24.ndim != 3:
if not width or not height:
raise ValueError("When giving a non 2D numpy array, width and "
"height must be supplied")
- if rgb24.nbytes/3 != width*height:
+ if rgb24.nbytes / 3 != width * height:
raise ValueError("numpy array size mismatch")
else:
if rgb24.itemsize != 1:
@@ -343,12 +331,12 @@ def __EncodedAttribute_generic_encode_rgb24(self, rgb24, width=0, height=0, qual
if rgb24.flags.aligned != True:
raise TypeError("Currently, only contiguous, aligned numpy arrays "
"are supported")
-
+
if not is_str and (not width or not height):
height = len(rgb24)
if height < 1:
raise IndexError("Expected sequence with at least one row")
-
+
row0 = rgb24[0]
if not is_seq(row0):
raise IndexError("Expected sequence (str, numpy.ndarray, list, tuple or "
@@ -391,24 +379,24 @@ def __EncodedAttribute_encode_jpeg_rgb32(self, rgb32, width=0, height=0, quality
data = numpy.arange(100, dtype=numpy.int32)
data = numpy.array((data,data,data))
enc.encode_jpeg_rgb32(data)
- attr.set_value(data)
+ attr.set_value(enc)
"""
if not is_seq(rgb32):
raise TypeError("Expected sequence (str, numpy.ndarray, list, tuple "
"or bytearray) as first argument")
-
+
is_str = is_pure_str(rgb32)
if is_str:
if not width or not height:
raise ValueError("When giving a string as data, you must also "
"supply width and height")
-
+
if np and isinstance(rgb32, np.ndarray):
if rgb32.ndim != 2:
if not width or not height:
raise ValueError("When giving a non 2D numpy array, width and "
"height must be supplied")
- if rgb32.nbytes/4 != width*height:
+ if rgb32.nbytes / 4 != width * height:
raise ValueError("numpy array size mismatch")
else:
if rgb32.itemsize != 4:
@@ -424,7 +412,7 @@ def __EncodedAttribute_encode_jpeg_rgb32(self, rgb32, width=0, height=0, quality
height = len(rgb32)
if height < 1:
raise IndexError("Expected sequence with at least one row")
-
+
row0 = rgb32[0]
if not is_seq(row0):
raise IndexError("Expected sequence (str, numpy.ndarray, list, tuple or "
@@ -553,7 +541,7 @@ def __init_EncodedAttribute():
EncodedAttribute.decode_gray8 = __EncodedAttribute_decode_gray8
EncodedAttribute.decode_gray16 = __EncodedAttribute_decode_gray16
EncodedAttribute.decode_rgb32 = __EncodedAttribute_decode_rgb32
-
+
def __doc_EncodedAttribute():
pass
diff --git a/src/boost/python/exception.py b/src/boost/python/exception.py
index b172e04..84b4cf7 100644
--- a/src/boost/python/exception.py
+++ b/src/boost/python/exception.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
@@ -30,7 +18,7 @@ __all__ = ["exception_init"]
__docformat__ = "restructuredtext"
from .utils import document_static_method as __document_static_method
-from ._PyTango import Except, DevError
+from ._PyTango import Except, DevError, ErrSeverity
def __to_dev_failed(exc_type=None, exc_value=None, traceback=None):
"""to_dev_failed(exc_type, exc_value, traceback) -> PyTango.DevFailed
@@ -58,6 +46,27 @@ def __to_dev_failed(exc_type=None, exc_value=None, traceback=None):
except Exception as e:
return e
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+# DevError pickle
+# -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
+
+def __DevError__getinitargs__(self):
+ return ()
+
+def __DevError__getstate__(self):
+ return self.reason, self.desc, self.origin, int(self.severity)
+
+def __DevError__setstate__(self, state):
+ self.reason = state[0]
+ self.desc = state[1]
+ self.origin = state[2]
+ self.severity = ErrSeverity(state[3])
+
+def __init_DevError():
+ DevError.__getinitargs__ = __DevError__getinitargs__
+ DevError.__getstate__ = __DevError__getstate__
+ DevError.__setstate__ = __DevError__setstate__
+
def __init_Except():
Except.to_dev_failed = staticmethod(__to_dev_failed)
@@ -162,6 +171,7 @@ def __doc_DevError():
def exception_init(doc=True):
__init_Except()
+ __init_DevError()
if doc:
__doc_Except()
- __doc_DevError()
\ No newline at end of file
+ __doc_DevError()
diff --git a/src/boost/python/futures.py b/src/boost/python/futures.py
new file mode 100644
index 0000000..ad98474
--- /dev/null
+++ b/src/boost/python/futures.py
@@ -0,0 +1,109 @@
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
+
+"""This module exposes a futures version of :class:`PyTango.DeviceProxy` and
+:class:`PyTango.AttributeProxy"""
+
+__all__ = ["DeviceProxy", "AttributeProxy"]
+
+from functools import partial
+
+from PyTango import GreenMode
+from PyTango.device_proxy import get_device_proxy
+from PyTango.attribute_proxy import get_attribute_proxy
+
+
+DeviceProxy = partial(get_device_proxy, green_mode=GreenMode.Futures)
+DeviceProxy.__doc__ = """
+ DeviceProxy(self, dev_name, wait=True, timeout=True) -> DeviceProxy
+ DeviceProxy(self, dev_name, need_check_acc, wait=True, timeout=True) -> DeviceProxy
+
+ Creates a *futures* enabled :class:`~PyTango.DeviceProxy`.
+
+ The DeviceProxy constructor internally makes some network calls which makes
+ it *slow*. By using the futures *green mode* you are allowing other
+ python code to be executed in a cooperative way.
+
+ .. note::
+ The timeout parameter has no relation with the tango device client side
+ timeout (gettable by :meth:`~PyTango.DeviceProxy.get_timeout_millis` and
+ settable through :meth:`~PyTango.DeviceProxy.set_timeout_millis`)
+
+ :param dev_name: the device name or alias
+ :type dev_name: str
+ :param need_check_acc: in first version of the function it defaults to True.
+ Determines if at creation time of DeviceProxy it
+ should check for channel access (rarely used)
+ :type need_check_acc: bool
+ :param wait: whether or not to wait for result of creating a DeviceProxy.
+ :type wait: bool
+ :param timeout: The number of seconds to wait for the result.
+ If None, then there is no limit on the wait time.
+ Ignored when wait is False.
+ :type timeout: float
+ :returns:
+ if wait is True:
+ :class:`~PyTango.DeviceProxy`
+ else:
+ :class:`concurrent.futures.Future`
+ :throws:
+ * a *DevFailed* if wait is True and there is an error creating
+ the device.
+ * a *concurrent.futures.TimeoutError* if wait is False, timeout is not
+ None and the time to create the device has expired.
+
+ New in PyTango 8.1.0
+"""
+
+AttributeProxy = partial(get_attribute_proxy, green_mode=GreenMode.Futures)
+AttributeProxy.__doc__ = """
+ AttributeProxy(self, full_attr_name, wait=True, timeout=True) -> AttributeProxy
+ AttributeProxy(self, device_proxy, attr_name, wait=True, timeout=True) -> AttributeProxy
+
+ Creates a *futures* enabled :class:`~PyTango.AttributeProxy`.
+
+ The AttributeProxy constructor internally makes some network calls which
+ makes it *slow*. By using the *gevent mode* you are allowing other python
+ code to be executed in a cooperative way.
+
+ :param full_attr_name: the full name of the attribute
+ :type full_attr_name: str
+ :param device_proxy: the :class:`~PyTango.DeviceProxy`
+ :type device_proxy: DeviceProxy
+ :param attr_name: attribute name for the given device proxy
+ :type attr_name: str
+ :param wait: whether or not to wait for result of creating an
+ AttributeProxy.
+ :type wait: bool
+ :param timeout: The number of seconds to wait for the result.
+ If None, then there is no limit on the wait time.
+ Ignored when wait is False.
+ :type timeout: float
+ :returns:
+ if wait is True:
+ :class:`~PyTango.AttributeProxy`
+ else:
+ :class:`concurrent.futures.Future`
+ :throws:
+ * a *DevFailed* if wait is True and there is an error creating the
+ attribute.
+ * a *concurrent.futures.TimeoutError* if wait is False, timeout is not
+ None and the time to create the attribute has expired.
+
+ New in PyTango 8.1.0
+"""
+
+Device = DeviceProxy
+Attribute = AttributeProxy
+
+del GreenMode
+del get_device_proxy
+del get_attribute_proxy
diff --git a/src/boost/python/gevent.py b/src/boost/python/gevent.py
new file mode 100644
index 0000000..b556318
--- /dev/null
+++ b/src/boost/python/gevent.py
@@ -0,0 +1,109 @@
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
+
+"""This module exposes a gevent version of :class:`PyTango.DeviceProxy` and
+:class:`PyTango.AttributeProxy"""
+
+__all__ = ["DeviceProxy", "AttributeProxy"]
+
+from functools import partial
+
+from PyTango import GreenMode
+from PyTango.device_proxy import get_device_proxy
+from PyTango.attribute_proxy import get_attribute_proxy
+
+
+DeviceProxy = partial(get_device_proxy, green_mode=GreenMode.Gevent)
+DeviceProxy.__doc__ = """
+ DeviceProxy(self, dev_name, wait=True, timeout=True) -> DeviceProxy
+ DeviceProxy(self, dev_name, need_check_acc, wait=True, timeout=True) -> DeviceProxy
+
+ Creates a *gevent* enabled :class:`~PyTango.DeviceProxy`.
+
+ The DeviceProxy constructor internally makes some network calls which makes
+ it *slow*. By using the gevent *green mode* you are allowing other python
+ code to be executed in a cooperative way.
+
+ .. note::
+ The timeout parameter has no relation with the tango device client side
+ timeout (gettable by :meth:`~PyTango.DeviceProxy.get_timeout_millis` and
+ settable through :meth:`~PyTango.DeviceProxy.set_timeout_millis`)
+
+ :param dev_name: the device name or alias
+ :type dev_name: str
+ :param need_check_acc: in first version of the function it defaults to True.
+ Determines if at creation time of DeviceProxy it should check
+ for channel access (rarely used)
+ :type need_check_acc: bool
+ :param wait: whether or not to wait for result of creating a DeviceProxy.
+ :type wait: bool
+ :param timeout: The number of seconds to wait for the result.
+ If None, then there is no limit on the wait time.
+ Ignored when wait is False.
+ :type timeout: float
+ :returns:
+ if wait is True:
+ :class:`~PyTango.DeviceProxy`
+ else:
+ :class:`gevent.event.AsynchResult`
+ :throws:
+ * a *DevFailed* if wait is True and there is an error creating
+ the device.
+ * a *gevent.timeout.Timeout* if wait is False, timeout is not None and
+ the time to create the device has expired.
+
+ New in PyTango 8.1.0
+"""
+
+AttributeProxy = partial(get_attribute_proxy, green_mode=GreenMode.Gevent)
+AttributeProxy.__doc__ = """
+ AttributeProxy(self, full_attr_name, wait=True, timeout=True) -> AttributeProxy
+ AttributeProxy(self, device_proxy, attr_name, wait=True, timeout=True) -> AttributeProxy
+
+ Creates a *gevent* enabled :class:`~PyTango.AttributeProxy`.
+
+ The AttributeProxy constructor internally makes some network calls which
+ makes it *slow*. By using the *gevent mode* you are allowing other python
+ code to be executed in a cooperative way.
+
+ :param full_attr_name: the full name of the attribute
+ :type full_attr_name: str
+ :param device_proxy: the :class:`~PyTango.DeviceProxy`
+ :type device_proxy: DeviceProxy
+ :param attr_name: attribute name for the given device proxy
+ :type attr_name: str
+ :param wait: whether or not to wait for result of creating an
+ AttributeProxy.
+ :type wait: bool
+ :param timeout: The number of seconds to wait for the result.
+ If None, then there is no limit on the wait time.
+ Ignored when wait is False.
+ :type timeout: float
+ :returns:
+ if wait is True:
+ :class:`~PyTango.AttributeProxy`
+ else:
+ :class:`gevent.event.AsynchResult`
+ :throws:
+ * a *DevFailed* if wait is True and there is an error creating the
+ attribute.
+ * a *gevent.timeout.Timeout* if wait is False, timeout is not None
+ and the time to create the attribute has expired.
+
+ New in PyTango 8.1.0
+"""
+
+Device = DeviceProxy
+Attribute = AttributeProxy
+
+del GreenMode
+del get_device_proxy
+del get_attribute_proxy
diff --git a/src/boost/python/globals.py b/src/boost/python/globals.py
index e288607..f09c0a4 100644
--- a/src/boost/python/globals.py
+++ b/src/boost/python/globals.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
diff --git a/src/boost/python/green.py b/src/boost/python/green.py
new file mode 100644
index 0000000..a5ea588
--- /dev/null
+++ b/src/boost/python/green.py
@@ -0,0 +1,163 @@
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
+
+__all__ = ["get_green_mode", "set_green_mode",
+ "get_executor", "submit", "spawn",
+ "get_synch_executor", "synch_submit",
+ "get_gevent_executor", "gevent_submit",
+ "get_futures_executor", "futures_submit",
+ "result", "submitable", "green"]
+
+__docformat__ = "restructuredtext"
+
+import os
+from functools import wraps
+
+from ._PyTango import GreenMode
+from .tango_gevent import get_global_executor as get_gevent_executor
+from .tango_gevent import submit as gevent_submit
+from .tango_futures import get_global_executor as get_futures_executor
+from .tango_futures import submit as futures_submit
+
+__default_green_mode = GreenMode.Synchronous
+try:
+ __current_green_mode = getattr(GreenMode,
+ os.environ.get("PYTANGO_GREEN_MODE",
+ "Synchronous").capitalize())
+except:
+ __current_green_mode = __default_green_mode
+
+
+def set_green_mode(green_mode=None):
+ """Sets the global default PyTango green mode.
+
+ Advice: Use only in your final application. Don't use this in a python library
+ in order not to interfere with the beavior of other libraries and/or
+ application where your library is being.
+
+ :param green_mode: the new global default PyTango green mode
+ :type green_mode: GreenMode
+ """
+ global __current_green_mode
+ if green_mode is None:
+ green_mode = GreenMode.Synchronous
+ __current_green_mode = green_mode
+
+
+def get_green_mode():
+ """Returns the current global default PyTango green mode.
+
+ :returns: the current global default PyTango green mode
+ :rtype: GreenMode
+ """
+ return __current_green_mode
+
+
+class SynchExecutor(object):
+ def submit(self, fn, *args, **kwargs):
+ return fn(*args, **kwargs)
+
+__synch_executor = SynchExecutor()
+
+def get_synch_executor():
+ return __synch_executor
+
+def synch_submit(fn, *args, **kwargs):
+ return get_synch_executor().submit(fn, *args, **kwargs)
+
+__executor_map = {
+ GreenMode.Synchronous: get_synch_executor,
+ GreenMode.Futures: get_futures_executor,
+ GreenMode.Gevent: get_gevent_executor,
+}
+
+__submit_map = {
+ GreenMode.Synchronous: synch_submit,
+ GreenMode.Futures: futures_submit,
+ GreenMode.Gevent: gevent_submit,
+}
+
+def get_executor(mode):
+ return __executor_map[mode]()
+
+def get_submitter(mode):
+ executor = get_executor(mode)
+ if mode == GreenMode.Gevent:
+ return executor.spawn
+ return executor.submit
+
+def submit(mode, fn, *args, **kwargs):
+ return get_submitter(mode)(fn, *args, **kwargs)
+
+spawn = submit
+
+def result(value, green_mode, wait=True, timeout=None):
+ if wait and not green_mode is GreenMode.Synchronous:
+ if green_mode == GreenMode.Futures:
+ return value.result(timeout=timeout)
+ elif green_mode == GreenMode.Gevent:
+ return value.get(timeout=timeout)
+ return value
+
+def submitable(obj, green_mode=None):
+ """Returns a proper submit callable for the given object.
+
+ If the object has *_executors* and *_green_mode* members it returns a submit
+ callable for the executor corresponding to the green_mode.
+ Otherwise it returns the global submit callable for the given green_mode
+
+ :returns: green_mode, submit callable"""
+ # determine the efective green_mode
+ if green_mode is None:
+ if hasattr(obj, "get_green_mode"):
+ green_mode = obj.get_green_mode()
+ else:
+ green_mode = get_green_mode()
+
+ if green_mode == GreenMode.Synchronous:
+ return green_mode, synch_submit
+
+ has_executors = hasattr(obj, "_executors")
+ s_func = __submit_map[green_mode]
+ if green_mode == GreenMode.Futures:
+ if has_executors:
+ executor = obj._executors.get(GreenMode.Futures)
+ if executor:
+ s_func = executor.submit
+ elif green_mode == GreenMode.Gevent:
+ if has_executors:
+ executor = obj._executors.get(GreenMode.Gevent)
+ if executor:
+ s_func = executor.spawn
+ else:
+ raise TypeError("Undefined green_mode '%s' for %s" % (str(green_mode)), str(obj))
+ return green_mode, s_func
+
+def green(fn):
+ """make a method green. Can be used as a decorator"""
+
+ @wraps(fn)
+ def greener(self, *args, **kwargs):
+ # first take out all green parameters
+ green_mode = kwargs.pop('green_mode', None)
+ wait = kwargs.pop('wait', True)
+ timeout = kwargs.pop('timeout', None)
+
+ # get the proper submitable for the given green_mode
+ green_mode, submit = submitable(self, green_mode)
+
+ # submit the method
+ ret = submit(fn, self, *args, **kwargs)
+
+ # return the proper result
+ return result(ret, green_mode, wait=wait, timeout=timeout)
+ return greener
+
diff --git a/src/boost/python/group.py b/src/boost/python/group.py
index c121e9b..cbd75b7 100644
--- a/src/boost/python/group.py
+++ b/src/boost/python/group.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
@@ -177,8 +165,8 @@ def __init_proxy_Group():
for fname in proxy_methods:
proxy_call_define(fname)
- #Group.add.im_func.__doc__ = _RealGroup.add.__doc__
- #Group.get_group.im_func.__doc__ = _RealGroup.get_group.__doc__
+ #Group.add.__func__.__doc__ = _RealGroup.add.__doc__
+ #Group.get_group.__func__.__doc__ = _RealGroup.get_group.__doc__
#Group.__doc__ = _RealGroup.__doc__
diff --git a/src/boost/python/group_reply.py b/src/boost/python/group_reply.py
index 9d045f0..1ac3773 100644
--- a/src/boost/python/group_reply.py
+++ b/src/boost/python/group_reply.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
diff --git a/src/boost/python/group_reply_list.py b/src/boost/python/group_reply_list.py
index 272105a..9f5067d 100644
--- a/src/boost/python/group_reply_list.py
+++ b/src/boost/python/group_reply_list.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
diff --git a/src/boost/python/ipython/__init__.py b/src/boost/python/ipython/__init__.py
index 6b74895..94e27fb 100644
--- a/src/boost/python/ipython/__init__.py
+++ b/src/boost/python/ipython/__init__.py
@@ -1,41 +1,29 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# -----------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# -----------------------------------------------------------------------------
__all__ = ["init_ipython", "install", "load_ipython_extension",
"unload_ipython_extension", "load_config"]
-from .common import get_python_version, get_python_version_number, \
- get_ipython_version, get_ipython_version_list, \
- get_ipython_version_number, get_pytango_version, get_pytango_version_number
+from .common import get_python_version
+from .common import get_ipython_version
+from .common import get_pytango_version
-def default_init_ipython(ip, store=True, pytango=True, colors=True,
- console=True, magic=True):
+
+def default_init_ipython(*args, **kwargs):
print("Unsupported IPython version (%s) for tango profile" \
% get_ipython_version())
print("Supported IPython versions are: >= 0.10")
print("Starting normal IPython console...")
-def default_install(ipydir=None, verbose=True):
+def default_install(*args, **kwargs):
print("Unsupported IPython version (%s) for tango profile" \
% get_ipython_version())
print("Supported IPython versions are: >= 0.10")
@@ -44,8 +32,9 @@ def default_install(ipydir=None, verbose=True):
init_ipython = default_init_ipython
install = default_install
-ipv = get_ipython_version_list()
-if ipv >= [0, 10] and ipv < [0, 11]:
+ipv = get_ipython_version()
+
+if ipv >= "0.10" and ipv < "0.11":
from . import ipython_00_10
init_ipython = ipython_00_10.init_ipython
install = ipython_00_10.install
@@ -54,7 +43,7 @@ if ipv >= [0, 10] and ipv < [0, 11]:
load_config = None
load_ipython_extension = None
unload_ipython_extension = None
-elif ipv >= [0, 11] and ipv < [1, 0]:
+elif ipv >= "0.11" and ipv < "1.0":
from . import ipython_00_11
init_ipython = None
install = ipython_00_11.install
@@ -63,7 +52,16 @@ elif ipv >= [0, 11] and ipv < [1, 0]:
load_config = ipython_00_11.load_config
load_ipython_extension = ipython_00_11.load_ipython_extension
unload_ipython_extension = ipython_00_11.unload_ipython_extension
-
+elif ipv >= "1.00":
+ from . import ipython_10_00
+ init_ipython = None
+ install = ipython_10_00.install
+ is_installed = ipython_10_00.is_installed
+ __run = ipython_10_00.run
+ load_config = ipython_10_00.load_config
+ load_ipython_extension = ipython_10_00.load_ipython_extension
+ unload_ipython_extension = ipython_10_00.unload_ipython_extension
+
def run():
if not is_installed():
install(verbose=False)
diff --git a/src/boost/python/ipython/common.py b/src/boost/python/ipython/common.py
index 8876a09..1ae516f 100644
--- a/src/boost/python/ipython/common.py
+++ b/src/boost/python/ipython/common.py
@@ -1,102 +1,31 @@
#!/usr/bin/env python
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# -----------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# -----------------------------------------------------------------------------
"""functions common (hopefully) to all ipython versions"""
-__all__ = ["translate_version_str2int", "translate_version_str2list",
- "get_python_version", "get_python_version_number",
- "get_ipython_version", "get_ipython_version_list",
- "get_ipython_version_number",
- "get_pytango_version", "get_pytango_version_number"]
+__all__ = ["get_python_version",
+ "get_ipython_version",
+ "get_pytango_version"]
import sys
-import math
-
-def translate_version_str2int(version_str):
- """Translates a version string in format 'x[.y[.z[...]]]' into a 000000 number"""
-
- parts = version_str.split('.')
- i, v, l = 0, 0, len(parts)
- if not l:
- return v
- while i<3:
- try:
- v += int(parts[i])*int(math.pow(10,(2-i)*2))
- l -= 1
- i += 1
- except ValueError:
- return v
- if not l: return v
- return v
-
- try:
- v += 10000*int(parts[0])
- l -= 1
- except ValueError:
- return v
- if not l: return v
-
- try:
- v += 100*int(parts[1])
- l -= 1
- except ValueError:
- return v
- if not l: return v
-
- try:
- v += int(parts[0])
- l -= 1
- except ValueError:
- return v
- if not l: return v
-
-def translate_version_str2list(version_str):
- """Translates a version string in format 'x[.y[.z[...]]]' into a list of
- numbers"""
- if version_str is None:
- ver = [0, 0]
- else:
- ver = []
- for i in version_str.split(".")[:2]:
- try:
- i = int(i)
- except:
- i = 0
- ver.append(i)
- return ver
+from distutils.version import StrictVersion
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
# Python utilities
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
def get_python_version():
- return '.'.join(map(str, sys.version_info[:3]))
-
-def get_python_version_number():
- pyver_str = get_python_version()
- return translate_version_str2int(pyver_str)
+ return StrictVersion('.'.join(map(str, sys.version_info[:3])))
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
# IPython utilities
@@ -116,17 +45,7 @@ def get_ipython_version():
pass
except:
pass
- return v
-
-def get_ipython_version_list():
- ipv_str = get_ipython_version()
- return translate_version_str2list(ipv_str)
-
-def get_ipython_version_number():
- """Returns the current IPython version number"""
- ipyver_str = get_ipython_version()
- if ipyver_str is None: return None
- return translate_version_str2int(ipyver_str)
+ return StrictVersion(v)
#-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
# PyTango utilities
@@ -138,11 +57,7 @@ def get_pytango_version():
except:
return
try:
- return PyTango.Release.version
+ v = PyTango.Release.version
except:
- return '0.0.0'
-
-def get_pytango_version_number():
- tgver_str = get_pytango_version()
- if tgver_str is None: return None
- return translate_version_str2int(tgver_str)
\ No newline at end of file
+ v = '0.0.0'
+ return StrictVersion(v)
diff --git a/src/boost/python/ipython/eventlogger.py b/src/boost/python/ipython/eventlogger.py
index a05b445..e0ebad3 100644
--- a/src/boost/python/ipython/eventlogger.py
+++ b/src/boost/python/ipython/eventlogger.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# -----------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# -----------------------------------------------------------------------------
from __future__ import print_function
diff --git a/src/boost/python/ipython/ipython_00_10/__init__.py b/src/boost/python/ipython/ipython_00_10/__init__.py
index 06b5776..583c19a 100644
--- a/src/boost/python/ipython/ipython_00_10/__init__.py
+++ b/src/boost/python/ipython/ipython_00_10/__init__.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# -----------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# -----------------------------------------------------------------------------
__all__ = ['init_ipython', 'install']
diff --git a/src/boost/python/ipython/ipython_00_10/ipy_install.py b/src/boost/python/ipython/ipython_00_10/ipy_install.py
index 00efcc1..8fb2144 100644
--- a/src/boost/python/ipython/ipython_00_10/ipy_install.py
+++ b/src/boost/python/ipython/ipython_00_10/ipy_install.py
@@ -1,27 +1,15 @@
#!/usr/bin/env python
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# -----------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# -----------------------------------------------------------------------------
import sys
import os
diff --git a/src/boost/python/ipython/ipython_00_10/ipy_qt.py b/src/boost/python/ipython/ipython_00_10/ipy_qt.py
index 38bd4c6..6ba06b6 100644
--- a/src/boost/python/ipython/ipython_00_10/ipy_qt.py
+++ b/src/boost/python/ipython/ipython_00_10/ipy_qt.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# -----------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# -----------------------------------------------------------------------------
import logging
import PyTango
diff --git a/src/boost/python/ipython/ipython_00_10/ipython_00_10.py b/src/boost/python/ipython/ipython_00_10/ipython_00_10.py
index 1a530ea..9bc8a6c 100644
--- a/src/boost/python/ipython/ipython_00_10/ipython_00_10.py
+++ b/src/boost/python/ipython/ipython_00_10/ipython_00_10.py
@@ -1,27 +1,15 @@
#!/usr/bin/env python
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# -----------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# -----------------------------------------------------------------------------
"""An IPython profile designed to provide a user friendly interface to Tango"""
@@ -877,10 +865,10 @@ def init_console(ip):
TermColors = IPython.ColorANSI.TermColors
- d = { "version" : PyTango.ipython.get_pytango_version(),
- "pyver" : PyTango.ipython.get_python_version(),
- "ipyver" : PyTango.ipython.get_ipython_version(),
- "pytangover" : PyTango.ipython.get_pytango_version() }
+ d = { "version" : str(PyTango.ipython.get_pytango_version()),
+ "pyver" : str(PyTango.ipython.get_python_version()),
+ "ipyver" : str(PyTango.ipython.get_ipython_version()),
+ "pytangover" : str(PyTango.ipython.get_pytango_version()) }
d.update(TermColors.__dict__)
o = ip.options
diff --git a/src/boost/python/ipython/ipython_00_11/__init__.py b/src/boost/python/ipython/ipython_00_11/__init__.py
index 443c485..587afd6 100644
--- a/src/boost/python/ipython/ipython_00_11/__init__.py
+++ b/src/boost/python/ipython/ipython_00_11/__init__.py
@@ -1,29 +1,18 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# -----------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# -----------------------------------------------------------------------------
__all__ = ['load_ipython_extension', 'unload_ipython_extension', 'load_config',
'run', 'install', 'is_installed']
-from .ipython_00_11 import load_ipython_extension, unload_ipython_extension, \
+from .ipython_10_00 import load_ipython_extension, unload_ipython_extension, \
load_config, run
from .ipy_install import install, is_installed
+
diff --git a/src/boost/python/ipython/ipython_00_11/ipy_install.py b/src/boost/python/ipython/ipython_00_11/ipy_install.py
index 81d916f..d246cb9 100644
--- a/src/boost/python/ipython/ipython_00_11/ipy_install.py
+++ b/src/boost/python/ipython/ipython_00_11/ipy_install.py
@@ -1,27 +1,15 @@
#!/usr/bin/env python
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# -----------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# -----------------------------------------------------------------------------
from __future__ import with_statement
@@ -37,6 +25,7 @@ from IPython.utils.io import ask_yes_no
import PyTango
+
__PROFILE = """\
#!/usr/bin/env ipython
\"\"\"An automaticaly generated IPython profile designed to provide a user
@@ -51,14 +40,15 @@ PyTango.ipython.load_config(config)
# Put any additional environment here
"""
+_CONFIG_FILE_NAME = 'ipython_config.py'
+
def is_installed(ipydir=None, profile='tango'):
ipython_dir = ipydir or get_ipython_dir()
try:
p_dir = ProfileDir.find_profile_dir_by_name(ipython_dir, profile)
except ProfileDirError:
return False
- config_file_name = BaseIPythonApplication.config_file_name.default_value
- abs_config_file_name = os.path.join(p_dir.location, config_file_name)
+ abs_config_file_name = os.path.join(p_dir.location, _CONFIG_FILE_NAME)
return os.path.isfile(abs_config_file_name)
def install(ipydir=None, verbose=True, profile='tango'):
@@ -72,9 +62,7 @@ def install(ipydir=None, verbose=True, profile='tango'):
p_dir = ProfileDir.find_profile_dir_by_name(ipython_dir, profile)
except ProfileDirError:
p_dir = ProfileDir.create_profile_dir_by_name(ipython_dir, profile)
-
- config_file_name = BaseIPythonApplication.config_file_name.default_value
- abs_config_file_name = os.path.join(p_dir.location, config_file_name)
+ abs_config_file_name = os.path.join(p_dir.location, _CONFIG_FILE_NAME)
create_config = True
if os.path.isfile(abs_config_file_name):
create_config = ask_yes_no("Tango configuration file already exists. "\
diff --git a/src/boost/python/ipython/ipython_00_11/ipython_00_11.py b/src/boost/python/ipython/ipython_00_11/ipython_00_11.py
index 38a951c..bbf5911 100644
--- a/src/boost/python/ipython/ipython_00_11/ipython_00_11.py
+++ b/src/boost/python/ipython/ipython_00_11/ipython_00_11.py
@@ -1,27 +1,15 @@
#!/usr/bin/env python
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# -----------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# -----------------------------------------------------------------------------
"""An IPython profile designed to provide a user friendly interface to Tango"""
@@ -1141,10 +1129,10 @@ def load_config(config):
import PyTango.ipython
import IPython.utils.coloransi
- d = { "version" : PyTango.ipython.get_pytango_version(),
- "pyver" : PyTango.ipython.get_python_version(),
- "ipyver" : PyTango.ipython.get_ipython_version(),
- "pytangover" : PyTango.ipython.get_pytango_version(), }
+ d = { "version" : str(PyTango.ipython.get_pytango_version()),
+ "pyver" : str(PyTango.ipython.get_python_version()),
+ "ipyver" : str(PyTango.ipython.get_ipython_version()),
+ "pytangover" : str(PyTango.ipython.get_pytango_version()), }
d.update(IPython.utils.coloransi.TermColors.__dict__)
so = Struct(
@@ -1152,8 +1140,7 @@ def load_config(config):
so = config.get("tango_options", so)
- import PyTango.ipython
- ipy_ver = PyTango.ipython.get_ipython_version_list()
+ ipy_ver = PyTango.ipython.get_ipython_version()
# ------------------------------------
# Application
@@ -1167,7 +1154,7 @@ def load_config(config):
i_shell = config.InteractiveShell
i_shell.colors = 'Linux'
- if ipy_ver >= [0, 12]:
+ if ipy_ver >= "0.12":
# ------------------------------------
# PromptManager (ipython >= 0.12)
# ------------------------------------
diff --git a/src/boost/python/ipython/ipython_10_00/__init__.py b/src/boost/python/ipython/ipython_10_00/__init__.py
new file mode 100644
index 0000000..587afd6
--- /dev/null
+++ b/src/boost/python/ipython/ipython_10_00/__init__.py
@@ -0,0 +1,18 @@
+# -----------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# -----------------------------------------------------------------------------
+
+__all__ = ['load_ipython_extension', 'unload_ipython_extension', 'load_config',
+ 'run', 'install', 'is_installed']
+
+from .ipython_10_00 import load_ipython_extension, unload_ipython_extension, \
+ load_config, run
+from .ipy_install import install, is_installed
+
diff --git a/src/boost/python/ipython/ipython_00_11/ipy_install.py b/src/boost/python/ipython/ipython_10_00/ipy_install.py
similarity index 63%
copy from src/boost/python/ipython/ipython_00_11/ipy_install.py
copy to src/boost/python/ipython/ipython_10_00/ipy_install.py
index 81d916f..d246cb9 100644
--- a/src/boost/python/ipython/ipython_00_11/ipy_install.py
+++ b/src/boost/python/ipython/ipython_10_00/ipy_install.py
@@ -1,27 +1,15 @@
#!/usr/bin/env python
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# -----------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# -----------------------------------------------------------------------------
from __future__ import with_statement
@@ -37,6 +25,7 @@ from IPython.utils.io import ask_yes_no
import PyTango
+
__PROFILE = """\
#!/usr/bin/env ipython
\"\"\"An automaticaly generated IPython profile designed to provide a user
@@ -51,14 +40,15 @@ PyTango.ipython.load_config(config)
# Put any additional environment here
"""
+_CONFIG_FILE_NAME = 'ipython_config.py'
+
def is_installed(ipydir=None, profile='tango'):
ipython_dir = ipydir or get_ipython_dir()
try:
p_dir = ProfileDir.find_profile_dir_by_name(ipython_dir, profile)
except ProfileDirError:
return False
- config_file_name = BaseIPythonApplication.config_file_name.default_value
- abs_config_file_name = os.path.join(p_dir.location, config_file_name)
+ abs_config_file_name = os.path.join(p_dir.location, _CONFIG_FILE_NAME)
return os.path.isfile(abs_config_file_name)
def install(ipydir=None, verbose=True, profile='tango'):
@@ -72,9 +62,7 @@ def install(ipydir=None, verbose=True, profile='tango'):
p_dir = ProfileDir.find_profile_dir_by_name(ipython_dir, profile)
except ProfileDirError:
p_dir = ProfileDir.create_profile_dir_by_name(ipython_dir, profile)
-
- config_file_name = BaseIPythonApplication.config_file_name.default_value
- abs_config_file_name = os.path.join(p_dir.location, config_file_name)
+ abs_config_file_name = os.path.join(p_dir.location, _CONFIG_FILE_NAME)
create_config = True
if os.path.isfile(abs_config_file_name):
create_config = ask_yes_no("Tango configuration file already exists. "\
diff --git a/src/boost/python/ipython/ipython_00_11/ipython_00_11.py b/src/boost/python/ipython/ipython_10_00/ipython_10_00.py
similarity index 96%
copy from src/boost/python/ipython/ipython_00_11/ipython_00_11.py
copy to src/boost/python/ipython/ipython_10_00/ipython_10_00.py
index 38a951c..926f119 100644
--- a/src/boost/python/ipython/ipython_00_11/ipython_00_11.py
+++ b/src/boost/python/ipython/ipython_10_00/ipython_10_00.py
@@ -1,27 +1,13 @@
-#!/usr/bin/env python
-
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# -----------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# -----------------------------------------------------------------------------
"""An IPython profile designed to provide a user friendly interface to Tango"""
@@ -41,11 +27,12 @@ from IPython.utils.ipstruct import Struct
from IPython.core.page import page
from IPython.core.interactiveshell import InteractiveShell
from IPython.config.application import Application
-from IPython.frontend.terminal.ipapp import launch_new_instance
+from IPython.terminal.ipapp import launch_new_instance
import PyTango
import PyTango.utils
+
_TG_EXCEPTIONS = PyTango.DevFailed, PyTango.ConnectionFailed, \
PyTango.CommunicationFailed, \
PyTango.NamedDevFailed, PyTango.NamedDevFailedList, \
@@ -1141,10 +1128,10 @@ def load_config(config):
import PyTango.ipython
import IPython.utils.coloransi
- d = { "version" : PyTango.ipython.get_pytango_version(),
- "pyver" : PyTango.ipython.get_python_version(),
- "ipyver" : PyTango.ipython.get_ipython_version(),
- "pytangover" : PyTango.ipython.get_pytango_version(), }
+ d = { "version" : str(PyTango.ipython.get_pytango_version()),
+ "pyver" : str(PyTango.ipython.get_python_version()),
+ "ipyver" : str(PyTango.ipython.get_ipython_version()),
+ "pytangover" : str(PyTango.ipython.get_pytango_version()), }
d.update(IPython.utils.coloransi.TermColors.__dict__)
so = Struct(
@@ -1152,8 +1139,7 @@ def load_config(config):
so = config.get("tango_options", so)
- import PyTango.ipython
- ipy_ver = PyTango.ipython.get_ipython_version_list()
+ ipy_ver = PyTango.ipython.get_ipython_version()
# ------------------------------------
# Application
@@ -1167,7 +1153,7 @@ def load_config(config):
i_shell = config.InteractiveShell
i_shell.colors = 'Linux'
- if ipy_ver >= [0, 12]:
+ if ipy_ver >= "0.12":
# ------------------------------------
# PromptManager (ipython >= 0.12)
# ------------------------------------
@@ -1253,7 +1239,7 @@ def run():
# protect this code against an import error
try:
from IPython.utils.traitlets import Unicode
- from IPython.frontend.qt.console.rich_ipython_widget import RichIPythonWidget
+ from IPython.qt.console.rich_ipython_widget import RichIPythonWidget
class ITangoConsole(RichIPythonWidget):
@@ -1263,8 +1249,8 @@ def run():
config = get_config()
return config.ITangoConsole.banner
- import IPython.frontend.qt.console.qtconsoleapp
- IPythonQtConsoleApp = IPython.frontend.qt.console.qtconsoleapp.IPythonQtConsoleApp
+ import IPython.qt.console.qtconsoleapp
+ IPythonQtConsoleApp = IPython.qt.console.qtconsoleapp.IPythonQtConsoleApp
IPythonQtConsoleApp.widget_factory = ITangoConsole
except ImportError:
pass
diff --git a/src/boost/python/log4tango.py b/src/boost/python/log4tango.py
index 3e5088a..050977c 100644
--- a/src/boost/python/log4tango.py
+++ b/src/boost/python/log4tango.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module. It provides tango log classes that can
diff --git a/src/boost/python/pytango_init.py b/src/boost/python/pytango_init.py
index eaf6270..3dc2573 100644
--- a/src/boost/python/pytango_init.py
+++ b/src/boost/python/pytango_init.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
@@ -49,22 +37,59 @@ from .pytango_pprint import pytango_pprint_init
from .pyutil import pyutil_init
from .time_val import time_val_init
from ._PyTango import constants
+from ._PyTango import _get_tango_lib_release
__INITIALIZED = False
__DOC = True
+
def init_constants():
+ import sys
+ import platform
- tgver = tuple(map(int, constants.TgLibVers.split(".")))
- tgver_str = "0x%02d%02d%02d00" % (tgver[0], tgver[1], tgver[2])
- constants.TANGO_VERSION_HEX = int(tgver_str, 16)
-
+ tg_ver = tuple(map(int, constants.TgLibVers.split(".")))
+ tg_ver_str = "0x%02d%02d%02d00" % (tg_ver[0], tg_ver[1], tg_ver[2])
+ constants.TANGO_VERSION_HEX = int(tg_ver_str, 16)
+
+ BOOST_VERSION = ".".join(map(str, (constants.BOOST_MAJOR_VERSION,
+ constants.BOOST_MINOR_VERSION,
+ constants.BOOST_PATCH_VERSION)))
+ constants.BOOST_VERSION = BOOST_VERSION
+
+ class Compile(object):
+ PY_VERSION = constants.PY_VERSION
+ TANGO_VERSION = constants.TANGO_VERSION
+ BOOST_VERSION = constants.BOOST_VERSION
+ NUMPY_VERSION = constants.NUMPY_VERSION
+ #UNAME = tuple(map(str, json.loads(constants.UNAME)))
+
+ tg_rt_ver_nb = _get_tango_lib_release()
+ tg_rt_major_ver = tg_rt_ver_nb / 100
+ tg_rt_minor_ver = tg_rt_ver_nb / 10 % 10
+ tg_rt_patch_ver = tg_rt_ver_nb % 10
+ tg_rt_ver = ".".join(map(str, (tg_rt_major_ver, tg_rt_minor_ver,
+ tg_rt_patch_ver)))
+
+ class Runtime(object):
+ PY_VERSION = ".".join(map(str, sys.version_info[:3]))
+ TANGO_VERSION = tg_rt_ver
+ BOOST_VERSION = '0.0.0'
+ if constants.NUMPY_SUPPORT:
+ import numpy
+ NUMPY_VERSION = numpy.__version__
+ else:
+ NUMPY_VERSION = None
+ UNAME = platform.uname()
+
+ constants.Compile = Compile
+ constants.Runtime = Runtime
+
def init():
global __INITIALIZED
if __INITIALIZED:
return
-
+
global __DOC
doc = __DOC
init_constants()
@@ -86,7 +111,7 @@ def init():
pytango_pprint_init(doc=doc)
pyutil_init(doc=doc)
time_val_init(doc=doc)
-
+
# must come last: depends on device_proxy.init()
attribute_proxy_init(doc=doc)
diff --git a/src/boost/python/pytango_pprint.py b/src/boost/python/pytango_pprint.py
index 16b3f81..952d786 100644
--- a/src/boost/python/pytango_pprint.py
+++ b/src/boost/python/pytango_pprint.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
diff --git a/src/boost/python/pyutil.py b/src/boost/python/pyutil.py
index 862d4ed..23ac8a8 100644
--- a/src/boost/python/pyutil.py
+++ b/src/boost/python/pyutil.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
diff --git a/src/boost/python/release.py b/src/boost/python/release.py
index 40e8af4..dd3145b 100644
--- a/src/boost/python/release.py
+++ b/src/boost/python/release.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
@@ -52,10 +40,10 @@ class Release:
- keywords : (seq<str>) list of keywords
- license : (str) the license"""
name = 'PyTango'
- version_info = (8, 0, 3, 'final', 0)
+ version_info = (8, 1, 1, 'dev', 0)
version = '.'.join(map(str, version_info[:3]))
version_long = version + ''.join(map(str, version_info[3:]))
- version_description = 'This version implements the C++ Tango 8.0 API.'
+ version_description = 'This version implements the C++ Tango 8.1 API.'
version_number = int(version.replace('.',''))
description = 'A python binding for the Tango control system'
long_description = 'This module implements the Python Tango Device API ' \
@@ -65,6 +53,6 @@ class Release:
author_lines = "\n".join([ "%s <%s>" % x for x in authors.values()])
url = 'http://www.tango-controls.org/static/PyTango/'
download_url = 'http://pypi.python.org/packages/source/P/PyTango'
- platform = ['Linux', 'Windows XP/Vista/7']
+ platform = ['Linux', 'Windows XP/Vista/7/8']
keywords = ['Tango', 'CORBA', 'binding']
diff --git a/src/boost/python/server.py b/src/boost/python/server.py
new file mode 100644
index 0000000..ca7130a
--- /dev/null
+++ b/src/boost/python/server.py
@@ -0,0 +1,817 @@
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
+
+"""High Level API for writting Tango device servers.
+
+.. _pytango-hlapi-datatypes:
+
+.. rubric:: Data types
+
+When declaring attributes, properties or commands, one of the most important
+information is the data type. It is given by the keyword argument *dtype*.
+In order to provide a more *pythonic* interface, this argument is not retricted
+to the :obj:`~PyTango.CmdArgType` options.
+
+For example, to define a *SCALAR* :obj:`~PyTango.CmdArgType.DevLong`
+attribute you have several possibilities:
+
+#. :obj:`int`
+#. 'int'
+#. 'int32'
+#. 'integer'
+#. :obj:`PyTango.CmdArgType.DevLong`
+#. 'DevLong'
+#. :obj:`numpy.int32`
+
+To define a *SPECTRUM* attribute simply wrap the scalar data type in any
+python sequence:
+
+* using a *tuple*: ``(:obj:`int`,)`` or
+* using a *list*: ``[:obj:`int`]`` or
+* any other sequence type
+
+To define an *IMAGE* attribute simply wrap the scalar data type in any
+python sequence of sequences:
+
+* using a *tuple*: ``((:obj:`int`,),)`` or
+* using a *list*: ``[[:obj:`int`]]`` or
+* any other sequence type
+
+Below is the complete table of equivalences.
+
+======================================== ========================================
+ type tango type
+======================================== ========================================
+ ``None`` ``DevVoid``
+ ``DevVoid`` ``DevVoid``
+ ``DevBoolean`` ``DevBoolean``
+ ``DevShort`` ``DevShort``
+ ``DevLong`` ``DevLong``
+ ``DevFloat`` ``DevFloat``
+ ``DevDouble`` ``DevDouble``
+ ``DevUShort`` ``DevUShort``
+ ``DevULong`` ``DevULong``
+ ``DevString`` ``DevString``
+ ``DevVarCharArray`` ``DevVarCharArray``
+ ``DevVarShortArray`` ``DevVarShortArray``
+ ``DevVarLongArray`` ``DevVarLongArray``
+ ``DevVarFloatArray`` ``DevVarFloatArray``
+ ``DevVarDoubleArray`` ``DevVarDoubleArray``
+ ``DevVarUShortArray`` ``DevVarUShortArray``
+ ``DevVarULongArray`` ``DevVarULongArray``
+ ``DevVarStringArray`` ``DevVarStringArray``
+ ``DevVarLongStringArray`` ``DevVarLongStringArray``
+ ``DevVarDoubleStringArray`` ``DevVarDoubleStringArray``
+ ``DevState`` ``DevState``
+ ``DevVarBooleanArray`` ``DevVarBooleanArray``
+ ``DevUChar`` ``DevUChar``
+ ``DevLong64`` ``DevLong64``
+ ``DevULong64`` ``DevULong64``
+ ``DevVarLong64Array`` ``DevVarLong64Array``
+ ``DevVarULong64Array`` ``DevVarULong64Array``
+ ``DevInt`` ``DevInt``
+ ``DevEncoded`` ``DevEncoded``
+ ``chr`` ``DevUChar``
+ ``'DevBoolean'`` ``DevBoolean``
+ ``'DevDouble'`` ``DevDouble``
+ ``'DevEncoded'`` ``DevEncoded``
+ ``'DevFloat'`` ``DevFloat``
+ ``'DevInt'`` ``DevInt``
+ ``'DevLong'`` ``DevLong``
+ ``'DevLong64'`` ``DevLong64``
+ ``'DevShort'`` ``DevShort``
+ ``'DevState'`` ``DevState``
+ ``'DevString'`` ``DevString``
+ ``'DevUChar'`` ``DevUChar``
+ ``'DevULong'`` ``DevULong``
+ ``'DevULong64'`` ``DevULong64``
+ ``'DevUShort'`` ``DevUShort``
+ ``'DevVarBooleanArray'`` ``DevVarBooleanArray``
+ ``'DevVarCharArray'`` ``DevVarCharArray``
+ ``'DevVarDoubleArray'`` ``DevVarDoubleArray``
+ ``'DevVarDoubleStringArray'`` ``DevVarDoubleStringArray``
+ ``'DevVarFloatArray'`` ``DevVarFloatArray``
+ ``'DevVarLong64Array'`` ``DevVarLong64Array``
+ ``'DevVarLongArray'`` ``DevVarLongArray``
+ ``'DevVarLongStringArray'`` ``DevVarLongStringArray``
+ ``'DevVarShortArray'`` ``DevVarShortArray``
+ ``'DevVarStringArray'`` ``DevVarStringArray``
+ ``'DevVarULong64Array'`` ``DevVarULong64Array``
+ ``'DevVarULongArray'`` ``DevVarULongArray``
+ ``'DevVarUShortArray'`` ``DevVarUShortArray``
+ ``'DevVoid'`` ``DevVoid``
+ ``'None'`` ``DevVoid``
+ ``'bool'`` ``DevBoolean``
+ ``'boolean'`` ``DevBoolean``
+ ``'byte'`` ``DevUChar``
+ ``'bytearray'`` ``DevEncoded``
+ ``'bytes'`` ``DevEncoded``
+ ``'char'`` ``DevUChar``
+ ``'chr'`` ``DevUChar``
+ ``'double'`` ``DevDouble``
+ ``'float'`` ``DevDouble``
+ ``'float32'`` ``DevFloat``
+ ``'float64'`` ``DevDouble``
+ ``'int'`` ``DevLong``
+ ``'int16'`` ``DevShort``
+ ``'int32'`` ``DevLong``
+ ``'int64'`` ``DevLong64``
+ ``'str'`` ``DevString``
+ ``'string'`` ``DevString``
+ ``'text'`` ``DevString``
+ ``'uint'`` ``DevULong``
+ ``'uint16'`` ``DevUShort``
+ ``'uint32'`` ``DevULong``
+ ``'uint64'`` ``DevULong64``
+ :py:obj:`float` ``DevDouble``
+ :py:obj:`int` ``DevLong``
+ :py:obj:`str` ``DevString``
+ :py:obj:`bool` ``DevBoolean``
+ :py:obj:`bytearray` ``DevEncoded``
+ :py:obj:`numpy.bool_` ``DevBoolean``
+ :py:obj:`numpy.int16` ``DevShort``
+ :py:obj:`numpy.int32` ``DevLong``
+ :py:obj:`numpy.int64` ``DevLong64``
+ :py:obj:`numpy.uint8` ``DevUChar``
+ :py:obj:`numpy.uint16` ``DevUShort``
+ :py:obj:`numpy.uint32` ``DevULong``
+ :py:obj:`numpy.uint64` ``DevULong64``
+ :py:obj:`numpy.float32` ``DevFloat``
+ :py:obj:`numpy.float64` ``DevDouble``
+======================================== ========================================
+"""
+
+from __future__ import with_statement
+from __future__ import print_function
+
+__all__ = ["DeviceMeta", "Device", "LatestDeviceImpl", "attribute", "command",
+ "device_property", "class_property", "server_run"]
+
+import __builtin__
+import sys
+import inspect
+import functools
+import traceback
+
+from ._PyTango import DeviceImpl, Attribute, WAttribute, CmdArgType
+from ._PyTango import AttrDataFormat, AttrWriteType, DispLevel, constants
+from ._PyTango import DevFailed
+from .attr_data import AttrData
+from .device_class import DeviceClass
+from .utils import get_tango_device_classes, is_seq, is_non_str_seq
+from .utils import scalar_to_array_type
+
+API_VERSION = 2
+
+LatestDeviceImpl = get_tango_device_classes()[-1]
+
+def __build_to_tango_type():
+ ret = \
+ {
+ int : CmdArgType.DevLong,
+ str : CmdArgType.DevString,
+ bool : CmdArgType.DevBoolean,
+ bytearray : CmdArgType.DevEncoded,
+ float : CmdArgType.DevDouble,
+ chr : CmdArgType.DevUChar,
+ None : CmdArgType.DevVoid,
+
+ 'int' : CmdArgType.DevLong,
+ 'int16' : CmdArgType.DevShort,
+ 'int32' : CmdArgType.DevLong,
+ 'int64' : CmdArgType.DevLong64,
+ 'uint' : CmdArgType.DevULong,
+ 'uint16' : CmdArgType.DevUShort,
+ 'uint32' : CmdArgType.DevULong,
+ 'uint64' : CmdArgType.DevULong64,
+ 'str' : CmdArgType.DevString,
+ 'string' : CmdArgType.DevString,
+ 'text' : CmdArgType.DevString,
+ 'bool' : CmdArgType.DevBoolean,
+ 'boolean' : CmdArgType.DevBoolean,
+ 'bytes' : CmdArgType.DevEncoded,
+ 'bytearray' : CmdArgType.DevEncoded,
+ 'float' : CmdArgType.DevDouble,
+ 'float32' : CmdArgType.DevFloat,
+ 'float64' : CmdArgType.DevDouble,
+ 'double' : CmdArgType.DevDouble,
+ 'byte' : CmdArgType.DevUChar,
+ 'chr' : CmdArgType.DevUChar,
+ 'char' : CmdArgType.DevUChar,
+ 'None' : CmdArgType.DevVoid,
+ }
+
+ for key in dir(CmdArgType):
+ if key.startswith("Dev"):
+ value = getattr(CmdArgType, key)
+ ret[key] = ret[value] = value
+
+ if constants.NUMPY_SUPPORT:
+ import numpy
+ FROM_TANGO_TO_NUMPY_TYPE = { \
+ CmdArgType.DevBoolean : numpy.bool8,
+ CmdArgType.DevUChar : numpy.ubyte,
+ CmdArgType.DevShort : numpy.short,
+ CmdArgType.DevUShort : numpy.ushort,
+ CmdArgType.DevLong : numpy.int32,
+ CmdArgType.DevULong : numpy.uint32,
+ CmdArgType.DevLong64 : numpy.int64,
+ CmdArgType.DevULong64 : numpy.uint64,
+ CmdArgType.DevString : numpy.str,
+ CmdArgType.DevDouble : numpy.float64,
+ CmdArgType.DevFloat : numpy.float32,
+ }
+
+ for key,value in FROM_TANGO_TO_NUMPY_TYPE.items():
+ ret[value] = key
+ return ret
+
+TO_TANGO_TYPE = __build_to_tango_type()
+
+
+def get_tango_type_format(dtype=None, dformat=None):
+ if dformat is None:
+ dformat = AttrDataFormat.SCALAR
+ if is_non_str_seq(dtype):
+ dtype = dtype[0]
+ dformat = AttrDataFormat.SPECTRUM
+ if is_non_str_seq(dtype):
+ dtype = dtype[0]
+ dformat = AttrDataFormat.IMAGE
+ return TO_TANGO_TYPE[dtype], dformat
+
+
+def from_typeformat_to_type(dtype, dformat):
+ if dformat == AttrDataFormat.SCALAR:
+ return dtype
+ elif dformat == AttrDataFormat.IMAGE:
+ raise TypeError("Cannot translate IMAGE to tango type")
+ return scalar_to_array_type(dtype)
+
+
+def set_complex_value(attr, value):
+ is_tuple = isinstance(value, tuple)
+ dtype, fmt = attr.get_data_type(), attr.get_data_format()
+ if dtype == CmdArgType.DevEncoded:
+ if is_tuple and len(value) == 4:
+ attr.set_value_date_quality(*value)
+ elif is_tuple and len(value) == 3 and is_non_str_seq(value[0]):
+ attr.set_value_date_quality(value[0][0], value[0][1], *value[1:])
+ else:
+ attr.set_value(*value)
+ else:
+ if is_tuple:
+ if len(value) == 3:
+ if fmt == AttrDataFormat.SCALAR:
+ attr.set_value_date_quality(*value)
+ elif fmt == AttrDataFormat.SPECTRUM:
+ if is_seq(value[0]):
+ attr.set_value_date_quality(*value)
+ else:
+ attr.set_value(value)
+ else:
+ if is_seq(value[0]) and is_seq(value[0][0]):
+ attr.set_value_date_quality(*value)
+ else:
+ attr.set_value(value)
+ else:
+ attr.set_value(value)
+ else:
+ attr.set_value(value)
+
+
+def check_tango_device_klass_attribute_read_method(tango_device_klass, method_name):
+ """Checks if method given by it's name for the given DeviceImpl class has
+ the correct signature. If a read/write method doesn't have a parameter
+ (the traditional Attribute), then the method is wrapped into another method
+ which has correct parameter definition to make it work.
+
+ :param tango_device_klass: a DeviceImpl class
+ :type tango_device_klass: class
+ :param method_name: method to be cheched
+ :type attr_data: str"""
+ read_method = getattr(tango_device_klass, method_name)
+
+ @functools.wraps(read_method)
+ def read_attr(self, attr):
+ ret = read_method(self)
+ if not attr.get_value_flag() and ret is not None:
+ set_complex_value(attr, ret)
+ return ret
+ setattr(tango_device_klass, method_name, read_attr)
+
+
+def check_tango_device_klass_attribute_write_method(tango_device_klass, method_name):
+ """Checks if method given by it's name for the given DeviceImpl class has
+ the correct signature. If a read/write method doesn't have a parameter
+ (the traditional Attribute), then the method is wrapped into another method
+ which has correct parameter definition to make it work.
+
+ :param tango_device_klass: a DeviceImpl class
+ :type tango_device_klass: class
+ :param method_name: method to be cheched
+ :type attr_data: str"""
+ write_method = getattr(tango_device_klass, method_name)
+
+ @functools.wraps(write_method)
+ def write_attr(self, attr):
+ value = attr.get_write_value()
+ return write_method(self, value)
+ setattr(tango_device_klass, method_name, write_attr)
+
+
+def check_tango_device_klass_attribute_methods(tango_device_klass, attr_data):
+ """Checks if the read and write methods have the correct signature. If a
+ read/write method doesn't have a parameter (the traditional Attribute),
+ then the method is wrapped into another method to make this work
+
+ :param tango_device_klass: a DeviceImpl class
+ :type tango_device_klass: class
+ :param attr_data: the attribute data information
+ :type attr_data: AttrData"""
+ if attr_data.attr_write in (AttrWriteType.READ, AttrWriteType.READ_WRITE):
+ check_tango_device_klass_attribute_read_method(tango_device_klass, attr_data.read_method_name)
+ if attr_data.attr_write in (AttrWriteType.WRITE, AttrWriteType.READ_WRITE):
+ check_tango_device_klass_attribute_write_method(tango_device_klass, attr_data.write_method_name)
+
+
+class _DeviceClass(DeviceClass):
+
+ def __init__(self, name):
+ DeviceClass.__init__(self, name)
+ self.set_type(name)
+
+ def dyn_attr(self, dev_list):
+ """Invoked to create dynamic attributes for the given devices.
+ Default implementation calls
+ :meth:`TT.initialize_dynamic_attributes` for each device
+
+ :param dev_list: list of devices
+ :type dev_list: :class:`PyTango.DeviceImpl`"""
+
+ for dev in dev_list:
+ init_dyn_attrs = getattr(dev, "initialize_dynamic_attributes", None)
+ if init_dyn_attrs and callable(init_dyn_attrs):
+ try:
+ init_dyn_attrs()
+ except Exception:
+ import traceback
+ dev.warn_stream("Failed to initialize dynamic attributes")
+ dev.debug_stream("Details: " + traceback.format_exc())
+
+
+def create_tango_deviceclass_klass(tango_device_klass, attrs=None):
+ klass_name = tango_device_klass.__name__
+ if not issubclass(tango_device_klass, (Device)):
+ msg = "{0} device must inherit from PyTango.server.Device".format(klass_name)
+ raise Exception(msg)
+
+ if attrs is None:
+ attrs = tango_device_klass.__dict__
+
+ attr_list = {}
+ class_property_list = {}
+ device_property_list = {}
+ cmd_list = {}
+
+ for attr_name, attr_obj in attrs.items():
+ if isinstance(attr_obj, attribute):
+ attr_obj._set_name(attr_name)
+ attr_list[attr_name] = attr_obj
+ check_tango_device_klass_attribute_methods(tango_device_klass, attr_obj)
+ elif isinstance(attr_obj, device_property):
+ device_property_list[attr_name] = [attr_obj.dtype, attr_obj.doc, attr_obj.default_value]
+ elif isinstance(attr_obj, class_property):
+ class_property_list[attr_name] = [attr_obj.dtype, attr_obj.doc, attr_obj.default_value]
+ elif inspect.isroutine(attr_obj):
+ if hasattr(attr_obj, "__tango_command__"):
+ cmd_name, cmd_info = attr_obj.__tango_command__
+ cmd_list[cmd_name] = cmd_info
+
+ devclass_name = klass_name + "Class"
+
+ devclass_attrs = dict(class_property_list=class_property_list,
+ device_property_list=device_property_list,
+ cmd_list=cmd_list, attr_list=attr_list)
+ return type(devclass_name, (_DeviceClass,), devclass_attrs)
+
+
+def init_tango_device_klass(tango_device_klass, attrs=None, tango_class_name=None):
+ klass_name = tango_device_klass.__name__
+ tango_deviceclass_klass = create_tango_deviceclass_klass(tango_device_klass,
+ attrs=attrs)
+ if tango_class_name is None:
+ tango_klass_name = klass_name
+ tango_device_klass._DeviceClass = tango_deviceclass_klass
+ tango_device_klass._DeviceClassName = tango_klass_name
+ tango_device_klass._api = API_VERSION
+ return tango_device_klass
+
+
+def create_tango_device_klass(name, bases, attrs):
+ klass_name = name
+
+ LatestDeviceImplMeta = type(LatestDeviceImpl)
+ klass = LatestDeviceImplMeta(klass_name, bases, attrs)
+ init_tango_device_klass(klass, attrs)
+ return klass
+
+
+def DeviceMeta(name, bases, attrs):
+ """The :py:data:`metaclass` callable for :class:`Device`. Every subclass of
+ :class:`Device` must have associated this metaclass to itself in order to
+ work properly (boost-python internal limitation).
+
+ Example (python 2.x)::
+
+ from PyTango.server import Device, DeviceMeta
+
+ class PowerSupply(Device):
+ __metaclass__ = DeviceMeta
+
+ Example (python 3.x)::
+
+ from PyTango.server import Device, DeviceMeta
+
+ class PowerSupply(Device, metaclass=DeviceMeta):
+ pass
+ """
+ return create_tango_device_klass(name, bases, attrs)
+
+
+class Device(LatestDeviceImpl):
+ """High level DeviceImpl API. All Device specific classes should inherit
+ from this class."""
+
+ def __init__(self, cl, name):
+ LatestDeviceImpl.__init__(self, cl, name)
+ self.init_device()
+
+ def init_device(self):
+ """Tango init_device method. Default implementation calls
+ :meth:`get_device_properties`"""
+ self.get_device_properties()
+
+ def always_executed_hook(self):
+ """Tango always_executed_hook. Default implementation does nothing"""
+ pass
+
+ def initialize_dynamic_attributes(self):
+ """Method executed at initializion phase to create dynamic attributes.
+ Default implementation does nothing. Overwrite when necessary."""
+ pass
+
+
+class attribute(AttrData):
+ """declares a new tango attribute in a :class:`Device`. To be used like
+the python native :obj:`property` function. For example, to declare a
+scalar, `PyTango.DevDouble`, read-only attribute called *voltage* in a
+*PowerSupply* :class:`Device` do::
+
+ class PowerSupply(Device):
+
+ voltage = attribute()
+
+ def read_voltage(self):
+ self.voltage = 1.0
+
+It receives multiple keyword arguments.
+
+===================== ================================ ======================================= =======================================================================================
+parameter type default value description
+===================== ================================ ======================================= =======================================================================================
+name :obj:`str` class member name alternative attribute name
+dtype :obj:`object` :obj:`~PyTango.CmdArgType.DevDouble` data type (see :ref:`Data type equivalence <pytango-hlapi-datatypes>`)
+dformat :obj:`~PyTango.AttrDataFormat` :obj:`~PyTango.AttrDataFormat.SCALAR` data format
+max_dim_x :obj:`int` 1 maximum size for x dimension (ignored for SCALAR format)
+max_dim_y :obj:`int` 0 maximum size for y dimension (ignored for SCALAR and SPECTRUM formats)
+display_level :obj:`~PyTango.DispLevel` :obj:`~PyTango.DisLevel.OPERATOR` display level
+polling_period :obj:`int` -1 polling period
+memorized :obj:`bool` False attribute should or not be memorized
+hw_memorized :obj:`bool` False write method should be called at startup when restoring memorize value (dangerous!)
+access :obj:`~PyTango.AttrWriteType` :obj:`~PyTango.AttrWriteType.READ` read only/ read write / write only access
+fget (or fread) :obj:`str` or :obj:`callable` 'read_<attr_name>' read method name or method object
+fset (or fwrite) :obj:`str` or :obj:`callable` 'write_<attr_name>' write method name or method object
+is_allowed :obj:`str` or :obj:`callable` 'is_<attr_name>_allowed' is allowed method name or method object
+label :obj:`str` '<attr_name>' attribute label
+doc (or description) :obj:`str` '' attribute description
+unit :obj:`str` '' physical units the attribute value is in
+standard_unit :obj:`str` '' physical standard unit
+display_unit :obj:`str` '' physical display unit (hint for clients)
+format :obj:`str` '6.2f' attribute representation format
+min_value :obj:`str` None minimum allowed value
+max_value :obj:`str` None maximum allowed value
+min_alarm :obj:`str` None minimum value to trigger attribute alarm
+max_alarm :obj:`str` None maximum value to trigger attribute alarm
+min_warning :obj:`str` None minimum value to trigger attribute warning
+max_warning :obj:`str` None maximum value to trigger attribute warning
+delta_val :obj:`str` None
+delta_t :obj:`str` None
+abs_change :obj:`str` None minimum value change between events that causes event filter to send the event
+rel_change :obj:`str` None minimum relative change between events that causes event filter to send the event (%)
+period :obj:`str` None
+archive_abs_change :obj:`str` None
+archive_rel_change :obj:`str` None
+archive_period :obj:`str` None
+===================== ================================ ======================================= ======================================================================================="""
+
+ def __init__(self, **kwargs):
+ name = kwargs.pop("name", None)
+ class_name = kwargs.pop("class_name", None)
+ super(attribute, self).__init__(name, class_name)
+ if 'dtype' in kwargs:
+ kwargs['dtype'], kwargs['dformat'] = \
+ get_tango_type_format(kwargs['dtype'], kwargs.get('dformat'))
+ self.build_from_dict(kwargs)
+
+ def get_attribute(self, obj):
+ return obj.get_device_attr().get_attr_by_name(self.attr_name)
+
+ # --------------------
+ # descriptor interface
+ # --------------------
+
+ def __get__(self, obj, objtype):
+ return self.get_attribute(obj)
+
+ def __set__(self, obj, value):
+ attr = self.get_attribute(obj)
+ set_complex_value(attr, value)
+
+ def __delete__(self, obj):
+ obj.remove_attribute(self.attr_name)
+
+
+def _attribute(**kwargs):
+ """declares a new tango attribute in a :class:`Device`. To be used like
+the python native :obj:`property` function. For example, to declare a
+scalar, `PyTango.DevDouble`, read-only attribute called *voltage* in a
+*PowerSupply* :class:`Device` do::
+
+ class PowerSupply(Device):
+
+ voltage = attribute()
+
+ def read_voltage(self):
+ self.voltage = 1.0
+
+It receives multiple keyword arguments.
+
+===================== ================================ ======================================= =======================================================================================
+parameter type default value description
+===================== ================================ ======================================= =======================================================================================
+name :obj:`str` class member name alternative attribute name
+dtype :obj:`object` :obj:`~PyTango.CmdArgType.DevDouble` data type (see :ref:`Data type equivalence <pytango-hlapi-datatypes>`)
+dformat :obj:`~PyTango.AttrDataFormat` :obj:`~PyTango.AttrDataFormat.SCALAR` data format
+max_dim_x :obj:`int` 1 maximum size for x dimension (ignored for SCALAR format)
+max_dim_y :obj:`int` 0 maximum size for y dimension (ignored for SCALAR and SPECTRUM formats)
+display_level :obj:`~PyTango.DispLevel` :obj:`~PyTango.DisLevel.OPERATOR` display level
+polling_period :obj:`int` -1 polling period
+memorized :obj:`bool` False attribute should or not be memorized
+hw_memorized :obj:`bool` False write method should be called at startup when restoring memorize value (dangerous!)
+access :obj:`~PyTango.AttrWriteType` :obj:`~PyTango.AttrWriteType.READ` read only/ read write / write only access
+fget (or fread) :obj:`str` or :obj:`callable` 'read_<attr_name>' read method name or method object
+fset (or fwrite) :obj:`str` or :obj:`callable` 'write_<attr_name>' write method name or method object
+is_allowed :obj:`str` or :obj:`callable` 'is_<attr_name>_allowed' is allowed method name or method object
+label :obj:`str` '<attr_name>' attribute label
+doc (or description) :obj:`str` '' attribute description
+unit :obj:`str` '' physical units the attribute value is in
+standard_unit :obj:`str` '' physical standard unit
+display_unit :obj:`str` '' physical display unit (hint for clients)
+format :obj:`str` '6.2f' attribute representation format
+min_value :obj:`str` None minimum allowed value
+max_value :obj:`str` None maximum allowed value
+min_alarm :obj:`str` None minimum value to trigger attribute alarm
+max_alarm :obj:`str` None maximum value to trigger attribute alarm
+min_warning :obj:`str` None minimum value to trigger attribute warning
+max_warning :obj:`str` None maximum value to trigger attribute warning
+delta_val :obj:`str` None
+delta_t :obj:`str` None
+abs_change :obj:`str` None minimum value change between events that causes event filter to send the event
+rel_change :obj:`str` None minimum relative change between events that causes event filter to send the event (%)
+period :obj:`str` None
+archive_abs_change :obj:`str` None
+archive_rel_change :obj:`str` None
+archive_period :obj:`str` None
+===================== ================================ ======================================= ======================================================================================="""
+ if 'dtype' in kwargs:
+ kwargs['dtype'], kwargs['dformat'] = \
+ get_tango_type_format(kwargs['dtype'], kwargs.get('dformat'))
+ return attribute.from_dict(kwargs)
+
+
+def command(f=None, dtype_in=None, dformat_in=None, doc_in="",
+ dtype_out=None, dformat_out=None, doc_out="",):
+ """declares a new tango command in a :class:`Device`.
+ To be used like a decorator in the methods you want to declare as tango
+ commands. For example, to declare a *ramp* command that receives a
+ `PyTango.DevDouble` parameter called *current*, do::
+
+ class PowerSupply(Device):
+
+ @command(dtype_in=float)
+ def ramp(self, current):
+ self.info_stream("Ramping on %f..." % current)
+
+ # Another more elaborate command
+
+ @command(dtype_in=float, doc_in="the pressure to be set",
+ dtype_out=(bool, doc_out="True if it worked, False otherwise")
+ def setPressure(self, pressure):
+ self.info_stream("Setting pressure on %f..." % pressure)
+
+ :param dtype_in: a :ref:`data type <pytango-hlapi-datatypes>`
+ describing the type of parameter. Default is None meaning
+ no parameter.
+ :param dformat_in: parameter data format. Default is None.
+ :type dformat_in: AttrDataFormat
+ :param doc_in: parameter documentation
+ :type doc_in: str
+
+ :param dtype_out: a :ref:`data type <pytango-hlapi-datatypes>`
+ describing the type of return value. Default is None
+ meaning no return value.
+ :param dformat_out: return value data format. Default is None.
+ :type dformat_out: AttrDataFormat
+ :param doc_out: return value documentation
+ :type doc_out: str
+
+ """
+ if f is None:
+ return functools.partial(command,
+ dtype_in=dtype_in, dformat_in=dformat_in, doc_in=doc_in,
+ dtype_out=dtype_out, dformat_out=dformat_out, doc_out=doc_out)
+ name = f.__name__
+
+ dtype_in, dformat_in = get_tango_type_format(dtype_in, dformat_in)
+ dtype_out, dformat_out = get_tango_type_format(dtype_out, dformat_out)
+
+ din = [from_typeformat_to_type(dtype_in, dformat_in), doc_in]
+ dout = [from_typeformat_to_type(dtype_out, dformat_out), doc_out]
+ f.__tango_command__ = name, [din, dout]
+ return f
+
+
+class _property(object):
+
+ def __init__(self, dtype, doc='', default_value=None):
+ self.__value = None
+ dtype = from_typeformat_to_type(*get_tango_type_format(dtype))
+ self.dtype = dtype
+ self.doc = doc
+ self.default_value = default_value
+
+ def __get__(self, obj, objtype):
+ return self.__value
+
+ def __set__(self, obj, value):
+ self.__value = value
+
+ def __delete__(self, obj):
+ del self.__value
+
+
+class device_property(_property):
+ pass
+
+
+class class_property(_property):
+ pass
+
+
+def __server_run(classes, args=None, msg_stream=sys.stdout, util=None,
+ event_loop=None):
+ import PyTango
+ if msg_stream is None:
+ import io
+ msg_stream = io.BytesIO()
+
+ if args is None:
+ args = sys.argv
+
+ if util is None:
+ util = PyTango.Util(args)
+
+ if is_seq(classes):
+ for klass_info in classes:
+ if not hasattr(klass_info, '_api') or klass_info._api < 2:
+ raise Exception("When giving a single class, it must implement HLAPI (see PyTango.server)")
+ klass_klass = klass_info._DeviceClass
+ klass_name = klass_info._DeviceClassName
+ klass = klass_info
+ util.add_class(klass_klass, klass, klass_name)
+ else:
+ for klass_name, klass_info in classes.items():
+ if is_seq(klass_info):
+ klass_klass, klass = klass_info
+ else:
+ if not hasattr(klass_info, '_api') or klass_info._api < 2:
+ raise Exception("When giving a single class, it must implement HLAPI (see PyTango.server)")
+ klass_klass = klass_info._DeviceClass
+ klass_name = klass_info._DeviceClassName
+ klass = klass_info
+ util.add_class(klass_klass, klass, klass_name)
+ u_instance = PyTango.Util.instance()
+ if event_loop is not None:
+ u_instance.server_set_event_loop(event_loop)
+ u_instance.server_init()
+ msg_stream.write("Ready to accept request\n")
+ u_instance.server_run()
+ return util
+
+
+def server_run(classes, args=None, msg_stream=sys.stdout,
+ verbose=False, util=None, event_loop=None):
+ """Provides a simple way to run a tango server. It handles exceptions
+ by writting a message to the msg_stream.
+
+ The `classes` parameter can be either a sequence of :class:`~PyTango.server.Device`
+ classes or a dictionary where:
+
+ * key is the tango class name
+ * value is either:
+ #. a :class:`~PyTango.server.Device` class or
+ #. a a sequence of two elements :class:`~PyTango.DeviceClass`, :class:`~PyTango.DeviceImpl`
+
+ Example 1: registering and running a PowerSupply inheriting from :class:`~PyTango.server.Device`::
+
+ from PyTango import server_run
+ from PyTango.server import Device, DeviceMeta
+
+ class PowerSupply(Device):
+ __metaclass__ = DeviceMeta
+
+ server_run((PowerSupply,))
+
+ Example 2: registering and running a MyServer defined by tango classes
+ `MyServerClass` and `MyServer`::
+
+ import PyTango
+
+ class MyServer(PyTango.Device_4Impl):
+ pass
+
+ class MyServerClass(PyTango.DeviceClass):
+ pass
+
+ PyTango.server_run({"MyServer": (MyServerClass, MyServer)})
+
+ :param classes:
+ a sequence of :class:`~PyTango.server.Device` classes or
+ a dictionary where keyword is the tango class name and value is a
+ sequence of Tango Device Class python class, and Tango Device python class
+ :type classes: sequence or dict
+
+ :param args:
+ list of command line arguments [default: None, meaning use sys.argv]
+ :type args: list
+
+ :param msg_stream:
+ stream where to put messages [default: sys.stdout]
+
+ :param util:
+ PyTango Util object [default: None meaning create a Util instance]
+ :type util: :class:`~PyTango.Util`
+
+ :param event_loop: event_loop callable
+ :type event_loop: callable
+
+ :return: The Util singleton object
+ :rtype: :class:`~PyTango.Util`
+
+ .. versionadded:: 8.0.0
+
+ .. versionchanged:: 8.0.3
+ Added `util` keyword parameter.
+ Returns util object
+
+ .. versionchanged:: 8.1.1
+ Changed default msg_stream from *stderr* to *stdout*
+ Added `event_loop` keyword parameter.
+ Returns util object"""
+
+ if msg_stream is None:
+ import io
+ msg_stream = io.BytesIO()
+ write = msg_stream.write
+ try:
+ return __server_run(classes, args=args, util=util, event_loop=event_loop)
+ except KeyboardInterrupt:
+ write("Exiting: Keyboard interrupt\n")
+ except DevFailed as df:
+ write("Exiting: Server exited with PyTango.DevFailed:\n" + str(df) + "\n")
+ if verbose:
+ write(traceback.format_exc())
+ except Exception as e:
+ write("Exiting: Server exited with unforseen exception:\n" + str(e) + "\n")
+ if verbose:
+ write(traceback.format_exc())
+ write("\nExited\n")
diff --git a/src/boost/python/tango_futures.py b/src/boost/python/tango_futures.py
new file mode 100644
index 0000000..b0a8dc0
--- /dev/null
+++ b/src/boost/python/tango_futures.py
@@ -0,0 +1,43 @@
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
+
+__all__ = ["uses_future", "get_global_executor", "submit", "spawn"]
+
+__global_executor = None
+
+MAX_WORKERS = 8
+MODE = 'thread'
+
+
+def __get_executor_class():
+ import concurrent.futures
+ ret = None
+ if MODE == 'thread':
+ ret = concurrent.futures.ThreadPoolExecutor
+ else:
+ ret = concurrent.futures.ProcessPoolExecutor
+ return ret
+
+
+def get_global_executor():
+ global __global_executor
+ if __global_executor is None:
+ klass = __get_executor_class()
+ if klass is not None:
+ __global_executor = klass(max_workers=MAX_WORKERS)
+ return __global_executor
+
+
+def submit(fn, *args, **kwargs):
+ return get_global_executor().submit(fn, *args, **kwargs)
+
+
+spawn = submit
diff --git a/src/boost/python/tango_gevent.py b/src/boost/python/tango_gevent.py
new file mode 100644
index 0000000..019dbac
--- /dev/null
+++ b/src/boost/python/tango_gevent.py
@@ -0,0 +1,28 @@
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
+
+from __future__ import absolute_import
+
+__all__ = ["get_global_threadpool", "get_global_executor", "submit", "spawn"]
+
+
+def get_global_threadpool():
+ import gevent
+ return gevent.get_hub().threadpool
+
+
+def spawn(fn, *args, **kwargs):
+ return get_global_threadpool().spawn(fn, *args, **kwargs)
+
+
+get_global_executor = get_global_threadpool
+
+submit = spawn
diff --git a/src/boost/python/tango_numpy.py b/src/boost/python/tango_numpy.py
index 98649bd..b8070af 100644
--- a/src/boost/python/tango_numpy.py
+++ b/src/boost/python/tango_numpy.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
diff --git a/src/boost/python/time_val.py b/src/boost/python/time_val.py
index c0edd3a..d2e54c9 100644
--- a/src/boost/python/time_val.py
+++ b/src/boost/python/time_val.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
diff --git a/src/boost/python/utils.py b/src/boost/python/utils.py
index 6de5409..ca72698 100644
--- a/src/boost/python/utils.py
+++ b/src/boost/python/utils.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
@@ -30,25 +18,26 @@ from __future__ import print_function
__all__ = [ "is_pure_str", "is_seq", "is_non_str_seq", "is_integer",
"is_number", "is_scalar_type", "is_array_type", "is_numerical_type",
- "is_int_type", "is_float_type", "obj_2_str", "seqStr_2_obj",
+ "is_int_type", "is_float_type", "is_bool_type", "is_bin_type",
+ "is_str_type", "obj_2_str", "seqStr_2_obj",
+ "scalar_to_array_type",
"document_method", "document_static_method", "document_enum",
"CaselessList", "CaselessDict", "EventCallBack", "get_home",
"from_version_str_to_hex_str", "from_version_str_to_int",
- "server_run", "decorator" ]
+ "seq_2_StdStringVector", "StdStringVector_2_seq" ]
__docformat__ = "restructuredtext"
-import sys
import os
-import collections
+import sys
import numbers
-import functools
-import inspect
-import traceback
+import collections
from ._PyTango import StdStringVector, StdDoubleVector, \
DbData, DbDevInfos, DbDevExportInfos, CmdArgType, AttrDataFormat, \
- EventData, AttrConfEventData, DataReadyEventData, DevFailed, constants
+ EventData, AttrConfEventData, DataReadyEventData, DevFailed, constants, \
+ GreenMode
+
_scalar_int_types = (CmdArgType.DevShort, CmdArgType.DevUShort,
CmdArgType.DevInt, CmdArgType.DevLong, CmdArgType.DevULong,
@@ -60,9 +49,10 @@ _scalar_numerical_types = _scalar_int_types + _scalar_float_types
_scalar_str_types = (CmdArgType.DevString, CmdArgType.ConstDevString,)
+_scalar_bool_types = (CmdArgType.DevBoolean,)
+
_scalar_types = _scalar_numerical_types + _scalar_str_types + \
- (CmdArgType.DevBoolean, CmdArgType.DevEncoded,
- CmdArgType.DevUChar, CmdArgType.DevVoid)
+ _scalar_bool_types + (CmdArgType.DevEncoded, CmdArgType.DevUChar)
_array_int_types = (CmdArgType.DevVarShortArray, CmdArgType.DevVarUShortArray,
CmdArgType.DevVarLongArray, CmdArgType.DevVarULongArray,
@@ -72,10 +62,15 @@ _array_float_types = (CmdArgType.DevVarFloatArray, CmdArgType.DevVarDoubleArray)
_array_numerical_types = _array_int_types + _array_float_types
-_array_types = _array_numerical_types + (CmdArgType.DevVarBooleanArray,
- CmdArgType.DevVarStringArray,
- CmdArgType.DevVarCharArray, CmdArgType.DevVarDoubleStringArray,
- CmdArgType.DevVarLongStringArray)
+_array_str_types = (CmdArgType.DevVarStringArray,)
+
+_array_bool_types = (CmdArgType.DevVarBooleanArray,)
+
+_array_types = _array_numerical_types + _array_bool_types + _array_str_types + \
+ (CmdArgType.DevVarCharArray,
+ CmdArgType.DevVarDoubleStringArray, CmdArgType.DevVarLongStringArray)
+
+_binary_types = (CmdArgType.DevEncoded, CmdArgType.DevVarCharArray)
_scalar_to_array_type = {
CmdArgType.DevBoolean : CmdArgType.DevVarBooleanArray,
@@ -95,6 +90,7 @@ _scalar_to_array_type = {
__device_classes = None
+
def get_tango_device_classes():
global __device_classes
if __device_classes is None:
@@ -109,7 +105,7 @@ def get_tango_device_classes():
except AttributeError:
break
return __device_classes
-
+
__str_klasses = str,
__int_klasses = int,
__number_klasses = numbers.Number,
@@ -136,27 +132,33 @@ if constants.NUMPY_SUPPORT:
__int_klasses = tuple(list(__int_klasses) + [numpy.integer])
__number_klasses = tuple(list(__number_klasses) + [numpy.number])
__seq_klasses = tuple(list(__seq_klasses) + [numpy.ndarray])
-
+
__str_klasses = tuple(__str_klasses)
__int_klasses = tuple(__int_klasses)
__number_klasses = tuple(__number_klasses)
__seq_klasses = tuple(__seq_klasses)
+
def is_pure_str(obj):
return isinstance(obj , __str_klasses)
+
def is_seq(obj):
return isinstance(obj, __seq_klasses)
+
def is_non_str_seq(obj):
return is_seq(obj) and not is_pure_str(obj)
+
def is_integer(obj):
return isinstance(obj, __int_klasses)
+
def is_number(obj):
return isinstance(obj, __number_klasses)
+
def is_scalar(tg_type):
"""Tells if the given tango type is a scalar
@@ -166,7 +168,7 @@ def is_scalar(tg_type):
:return: True if the given tango type is a scalar or False otherwise
:rtype: :py:obj:`bool`
"""
-
+
global _scalar_types
return tg_type in _scalar_types
@@ -186,6 +188,7 @@ def is_array(tg_type):
is_array_type = is_array
+
def is_numerical(tg_type, inc_array=False):
"""Tells if the given tango type is numerical
@@ -207,6 +210,7 @@ def is_numerical(tg_type, inc_array=False):
is_numerical_type = is_numerical
+
def is_int(tg_type, inc_array=False):
"""Tells if the given tango type is integer
@@ -228,6 +232,7 @@ def is_int(tg_type, inc_array=False):
is_int_type = is_int
+
def is_float(tg_type, inc_array=False):
"""Tells if the given tango type is float
@@ -249,6 +254,68 @@ def is_float(tg_type, inc_array=False):
is_float_type = is_float
+
+def is_bool(tg_type, inc_array=False):
+ """Tells if the given tango type is boolean
+
+ :param tg_type: tango type
+ :type tg_type: :class:`PyTango.CmdArgType`
+ :param inc_array: (optional, default is False) determines if include array
+ in the list of checked types
+ :type inc_array: :py:obj:`bool`
+
+ :return: True if the given tango type is boolean or False otherwise
+ :rtype: :py:obj:`bool`
+ """
+ global _scalar_bool_types, _array_bool_types
+ if tg_type in _scalar_bool_types:
+ return True
+ if not inc_array:
+ return False
+ return tg_type in _array_bool_types
+
+is_bool_type = is_bool
+
+def is_str(tg_type, inc_array=False):
+ """Tells if the given tango type is string
+
+ :param tg_type: tango type
+ :type tg_type: :class:`PyTango.CmdArgType`
+ :param inc_array: (optional, default is False) determines if include array
+ in the list of checked types
+ :type inc_array: :py:obj:`bool`
+
+ :return: True if the given tango type is string or False otherwise
+ :rtype: :py:obj:`bool`
+ """
+ global _scalar_str_types, _array_str_types
+ if tg_type in _scalar_str_types:
+ return True
+ if not inc_array:
+ return False
+ return tg_type in _array_str_types
+
+is_str_type = is_str
+
+
+def is_bin(tg_type, inc_array=False):
+ """Tells if the given tango type is binary
+
+ :param tg_type: tango type
+ :type tg_type: :class:`PyTango.CmdArgType`
+ :param inc_array: (optional, default is False) determines if include array
+ in the list of checked types
+ :type inc_array: :py:obj:`bool`
+
+ :return: True if the given tango type is binary or False otherwise
+ :rtype: :py:obj:`bool`
+ """
+ global _scalar_bin_types
+ return tg_type in _scalar_bin_types
+
+is_bin_type = is_bin
+
+
def seq_2_StdStringVector(seq, vec=None):
"""Converts a python sequence<str> object to a :class:`PyTango.StdStringVector`
@@ -269,6 +336,7 @@ def seq_2_StdStringVector(seq, vec=None):
vec.append(str(e))
return vec
+
def StdStringVector_2_seq(vec, seq=None):
"""Converts a :class:`PyTango.StdStringVector` to a python sequence<str>
@@ -286,6 +354,7 @@ def StdStringVector_2_seq(vec, seq=None):
seq.append(str(e))
return seq
+
def seq_2_StdDoubleVector(seq, vec=None):
"""Converts a python sequence<float> object to a :class:`PyTango.StdDoubleVector`
@@ -306,6 +375,7 @@ def seq_2_StdDoubleVector(seq, vec=None):
vec.append(str(e))
return vec
+
def StdDoubleVector_2_seq(vec, seq=None):
"""Converts a :class:`PyTango.StdDoubleVector` to a python sequence<float>
@@ -322,6 +392,7 @@ def StdDoubleVector_2_seq(vec, seq=None):
for e in vec: seq.append(float(e))
return seq
+
def seq_2_DbDevInfos(seq, vec=None):
"""Converts a python sequence<DbDevInfo> object to a :class:`PyTango.DbDevInfos`
@@ -341,6 +412,7 @@ def seq_2_DbDevInfos(seq, vec=None):
for e in seq: vec.append(e)
return vec
+
def seq_2_DbDevExportInfos(seq, vec=None):
"""Converts a python sequence<DbDevExportInfo> object to a :class:`PyTango.DbDevExportInfos`
@@ -360,6 +432,7 @@ def seq_2_DbDevExportInfos(seq, vec=None):
for e in seq: vec.append(e)
return vec
+
def seq_2_DbData(seq, vec=None):
"""Converts a python sequence<DbDatum> object to a :class:`PyTango.DbData`
@@ -379,6 +452,7 @@ def seq_2_DbData(seq, vec=None):
for e in seq: vec.append(e)
return vec
+
def DbData_2_dict(db_data, d=None):
if d is None: d = {}
if not isinstance(db_data, DbData):
@@ -387,6 +461,7 @@ def DbData_2_dict(db_data, d=None):
d[db_datum.name] = db_datum.value_string
return d
+
def seqStr_2_obj(seq, tg_type, tg_format=None):
"""Translates a sequence<str> to a sequence of objects of give type and format
@@ -403,11 +478,12 @@ def seqStr_2_obj(seq, tg_type, tg_format=None):
return _seqStr_2_obj_from_type_format(seq, tg_type, tg_format)
return _seqStr_2_obj_from_type(seq, tg_type)
+
def _seqStr_2_obj_from_type(seq, tg_type):
-
+
if is_pure_str(seq):
seq = seq,
-
+
# Scalar cases
global _scalar_int_types
if tg_type in _scalar_int_types:
@@ -423,7 +499,7 @@ def _seqStr_2_obj_from_type(seq, tg_type):
if tg_type == CmdArgType.DevBoolean:
return seq[0].lower() == 'true'
-
+
#sequence cases
if tg_type in (CmdArgType.DevVarCharArray, CmdArgType.DevVarStringArray):
return seq
@@ -446,15 +522,16 @@ def _seqStr_2_obj_from_type(seq, tg_type):
argout = []
for x in seq:
argout.append(x.lower() == 'true')
- return argout
+ return argout
return []
+
def _seqStr_2_obj_from_type_format(seq, tg_type, tg_format):
if tg_format == AttrDataFormat.SCALAR:
return _seqStr_2_obj_from_type(tg_type, seq)
elif tg_format == AttrDataFormat.SPECTRUM:
- return _seqStr_2_obj_from_type(_scalar_to_array_type(tg_type), seq)
+ return _seqStr_2_obj_from_type(_scalar_to_array_type[tg_type], seq)
elif tg_format == AttrDataFormat.IMAGE:
if tg_type == CmdArgType.DevString:
return seq
@@ -478,10 +555,15 @@ def _seqStr_2_obj_from_type_format(seq, tg_type, tg_format):
tmp.append(float(y))
argout.append(tmp)
return argout
-
+
#UNKNOWN_FORMAT
return _seqStr_2_obj_from_type(tg_type, seq)
+
+def scalar_to_array_type(dtype):
+ return _scalar_to_array_type[dtype]
+
+
def obj_2_str(obj, tg_type):
"""Converts a python object into a string according to the given tango type
@@ -492,18 +574,17 @@ def obj_2_str(obj, tg_type):
:return: a string representation of the given object
:rtype: :py:obj:`str`
"""
- ret = ""
if tg_type in _scalar_types:
# scalar cases
- if isinstance(obj, collections.Sequence):
+ if is_pure_str(obj):
+ return obj
+ elif is_non_str_seq(obj):
if not len(obj):
- return ret
+ return ""
obj = obj[0]
- ret = str(obj).rstrip()
- else:
- # sequence cases
- ret = '\n'.join([ str(i) for i in obj ])
- return ret
+ return str(obj)
+ # sequence cases
+ return '\n'.join([str(i) for i in obj])
def __get_meth_func(klass, method_name):
meth = getattr(klass, method_name)
@@ -514,6 +595,7 @@ def __get_meth_func(klass, method_name):
func = meth.im_func
return meth, func
+
def copy_doc(klass, fnname):
"""Copies documentation string of a method from the super class into the
rewritten method of the given class"""
@@ -521,6 +603,7 @@ def copy_doc(klass, fnname):
meth, func = __get_meth_func(klass, fnname)
func.__doc__ = base_func.__doc__
+
def document_method(klass, method_name, d, add=True):
meth, func = __get_meth_func(klass, method_name)
if add:
@@ -530,6 +613,13 @@ def document_method(klass, method_name, d, add=True):
return
func.__doc__ = d
+ if func.__name__ != method_name:
+ try:
+ func.__name__ = method_name
+ except AttributeError:
+ pass
+
+
def document_static_method(klass, method_name, d, add=True):
meth, func = __get_meth_func(klass, method_name)
if add:
@@ -539,6 +629,7 @@ def document_static_method(klass, method_name, d, add=True):
return
meth.__doc__ = d
+
def document_enum(klass, enum_name, desc, append=True):
# derived = type(base)('derived', (base,), {'__doc__': 'desc'})
@@ -556,6 +647,7 @@ def document_enum(klass, enum_name, desc, append=True):
# Replace the original enum type with the new one
setattr(klass, enum_name, derived)
+
class CaselessList(list):
"""A case insensitive lists that has some caseless methods. Only allows
strings as list members. Most methods that would normally return a list,
@@ -572,28 +664,28 @@ class CaselessList(list):
def __init__(self, inlist=[]):
list.__init__(self)
for entry in inlist:
- if not isinstance(entry, str):
+ if not isinstance(entry, str):
raise TypeError('Members of this object must be strings. ' \
- 'You supplied \"%s\" which is \"%s\"' %
+ 'You supplied \"%s\" which is \"%s\"' %
(entry, type(entry)))
self.append(entry)
def findentry(self, item):
"""A caseless way of checking if an item is in the list or not.
It returns None or the entry."""
- if not isinstance(item, str):
+ if not isinstance(item, str):
raise TypeError('Members of this object must be strings. '\
'You supplied \"%s\"' % type(item))
for entry in self:
if item.lower() == entry.lower(): return entry
return None
-
+
def __contains__(self, item):
"""A caseless way of checking if a list has a member in it or not."""
for entry in self:
if item.lower() == entry.lower(): return True
return False
-
+
def remove(self, item):
"""Remove the first occurence of an item, the caseless way."""
for entry in self:
@@ -601,7 +693,7 @@ class CaselessList(list):
list.remove(self, entry)
return
raise ValueError(': list.remove(x): x not in list')
-
+
def copy(self):
"""Return a CaselessList copy of self."""
return CaselessList(self)
@@ -609,29 +701,29 @@ class CaselessList(list):
def list(self):
"""Return a normal list version of self."""
return list(self)
-
+
def lowercopy(self):
"""Return a lowercase (list) copy of self."""
return [entry.lower() for entry in self]
-
+
def append(self, item):
"""Adds an item to the list and checks it's a string."""
- if not isinstance(item, str):
+ if not isinstance(item, str):
raise TypeError('Members of this object must be strings. ' \
'You supplied \"%s\"' % type(item))
list.append(self, item)
-
+
def extend(self, item):
"""Extend the list with another list. Each member of the list must be
a string."""
- if not isinstance(item, list):
+ if not isinstance(item, list):
raise TypeError('You can only extend lists with lists. ' \
'You supplied \"%s\"' % type(item))
for entry in item:
- if not isinstance(entry, str):
+ if not isinstance(entry, str):
raise TypeError('Members of this object must be strings. '\
'You supplied \"%s\"' % type(entry))
- list.append(self, entry)
+ list.append(self, entry)
def count(self, item):
"""Counts references to 'item' in a caseless manner.
@@ -641,7 +733,7 @@ class CaselessList(list):
for entry in self:
if item.lower() == entry.lower():
count += 1
- return count
+ return count
def index(self, item, minindex=0, maxindex=None):
"""Provide an index of first occurence of item in the list. (or raise
@@ -651,9 +743,9 @@ class CaselessList(list):
s.index(x[, i[, j]]) return smallest k such that s[k] == x and i <= k < j
"""
if maxindex == None: maxindex = len(self)
- minindex = max(0, minindex)-1
+ minindex = max(0, minindex) - 1
maxindex = min(len(self), maxindex)
- if not isinstance(item, str):
+ if not isinstance(item, str):
raise TypeError('Members of this object must be strings. '\
'You supplied \"%s\"' % type(item))
index = minindex
@@ -662,11 +754,11 @@ class CaselessList(list):
if item.lower() == self[index].lower():
return index
raise ValueError(': list.index(x): x not in list')
-
+
def insert(self, i, x):
"""s.insert(i, x) same as s[i:i] = [x]
Raises TypeError if x isn't a string."""
- if not isinstance(x, str):
+ if not isinstance(x, str):
raise TypeError('Members of this object must be strings. ' \
'You supplied \"%s\"' % type(x))
list.insert(self, i, x)
@@ -680,15 +772,15 @@ class CaselessList(list):
the same length as the slice object requires.
"""
if isinstance(index, int):
- if not isinstance(value, str):
+ if not isinstance(value, str):
raise TypeError('Members of this object must be strings. ' \
'You supplied \"%s\"' % type(value))
list.__setitem__(self, index, value)
elif isinstance(index, slice):
- if not hasattr(value, '__len__'):
+ if not hasattr(value, '__len__'):
raise TypeError('Value given to set slice is not a sequence object.')
for entry in value:
- if not isinstance(entry, str):
+ if not isinstance(entry, str):
raise TypeError('Members of this object must be strings. ' \
'You supplied \"%s\"' % type(entry))
list.__setitem__(self, index, value)
@@ -698,7 +790,7 @@ class CaselessList(list):
def __setslice__(self, i, j, sequence):
"""Called to implement assignment to self[i:j]."""
for entry in sequence:
- if not isinstance(entry, str):
+ if not isinstance(entry, str):
raise TypeError('Members of this object must be strings. ' \
'You supplied \"%s\"' % type(entry))
list.__setslice__(self, i, j, sequence)
@@ -717,7 +809,7 @@ class CaselessList(list):
return list.__getitem__(self, index)
else:
return CaselessList(list.__getitem__(self, index))
-
+
def __add__(self, item):
"""To add a list, and return a CaselessList.
Every element of item must be a string."""
@@ -727,7 +819,7 @@ class CaselessList(list):
"""To add a list, and return a CaselessList.
Every element of item must be a string."""
return CaselessList(list.__add__(self, item))
-
+
def __iadd__(self, item):
"""To add a list in place."""
for entry in item: self.append(entry)
@@ -748,59 +840,59 @@ class CaselessDict(dict):
if other:
# Doesn't do keyword args
if isinstance(other, dict):
- for k,v in other.items():
+ for k, v in other.items():
dict.__setitem__(self, k.lower(), v)
else:
- for k,v in other:
+ for k, v in other:
dict.__setitem__(self, k.lower(), v)
-
+
def __getitem__(self, key):
return dict.__getitem__(self, key.lower())
-
+
def __setitem__(self, key, value):
dict.__setitem__(self, key.lower(), value)
-
+
def __contains__(self, key):
return dict.__contains__(self, key.lower())
def __delitem__(self, k):
dict.__delitem__(self, k.lower())
-
+
def has_key(self, key):
return dict.has_key(self, key.lower())
-
+
def get(self, key, def_val=None):
return dict.get(self, key.lower(), def_val)
-
+
def setdefault(self, key, def_val=None):
return dict.setdefault(self, key.lower(), def_val)
-
+
def update(self, other):
- for k,v in other.items():
+ for k, v in other.items():
dict.__setitem__(self, k.lower(), v)
-
+
def fromkeys(self, iterable, value=None):
d = CaselessDict()
for k in iterable:
dict.__setitem__(d, k.lower(), value)
return d
-
+
def pop(self, key, def_val=None):
return dict.pop(self, key.lower(), def_val)
-
+
def keys(self):
return CaselessList(dict.keys(self))
__DEFAULT_FACT_IOR_FILE = "/tmp/rdifact.ior"
-__BASE_LINE = "notifd"
-__END_NOTIFD_LINE = "/DEVICE/notifd:"
+__BASE_LINE = "notifd"
+__END_NOTIFD_LINE = "/DEVICE/notifd:"
__NOTIFD_FACTORY_PREFIX = "notifd/factory/"
def notifd2db(notifd_ior_file=__DEFAULT_FACT_IOR_FILE, files=None, host=None, out=sys.stdout):
ior_string = ""
with file(notifd_ior_file) as ior_file:
ior_string = ior_file.read()
-
+
if files is None:
return _notifd2db_real_db(ior_string, host=host, out=out)
else:
@@ -820,7 +912,7 @@ def _notifd2db_real_db(ior_string, host=None, out=sys.stdout):
import PyTango
print("going to export notification service event factory to " \
"Tango database ...", file=out)
-
+
num_retries = 3
while num_retries > 0:
try:
@@ -834,16 +926,16 @@ def _notifd2db_real_db(ior_string, host=None, out=sys.stdout):
print(str(df), file=out)
return
print("Can't create Tango database object, retrying....", file=out)
-
+
if host is None:
import socket
host_name = socket.getfqdn()
-
+
global __NOTIFD_FACTORY_PREFIX
notifd_factory_name = __NOTIFD_FACTORY_PREFIX + host_name
-
+
args = notifd_factory_name, ior_string, host_name, str(os.getpid()), "1"
-
+
num_retries = 3
while num_retries > 0:
try:
@@ -862,7 +954,7 @@ def _notifd2db_real_db(ior_string, host=None, out=sys.stdout):
num_retries = 0
except Exception:
num_retries = 0
-
+
if num_retries == 0:
print("Failed to export notification service event factory " \
"to TANGO database", file=out)
@@ -893,12 +985,12 @@ class EventCallBack(object):
def __init__(self, format="{date} {dev_name} {name} {type} {value}",
fd=sys.stdout, max_buf=100):
-
+
self._msg = format
self._fd = fd
self._evts = []
self._max_buf = max_buf
-
+
def get_events(self):
"""Returns the list of events received by this callback
@@ -906,7 +998,7 @@ class EventCallBack(object):
:rtype: sequence<obj>
"""
return self._evts
-
+
def push_event(self, evt):
"""Internal usage only"""
try:
@@ -914,7 +1006,7 @@ class EventCallBack(object):
except Exception as e:
print("Unexpected error in callback for %s: %s" \
% (str(evt), str(e)), file=self._fd)
-
+
def _push_event(self, evt):
"""Internal usage only"""
self._append(evt)
@@ -955,21 +1047,22 @@ class EventCallBack(object):
if len(evts) == self._max_buf:
evts.pop(0)
evts.append(evt)
-
+
def _get_value(self, evt):
"""Internal usage only"""
if evt.err:
e = evt.errors[0]
return "[%s] %s" % (e.reason, e.desc)
-
+
if isinstance(evt, EventData):
- return "[%s] %s" %(evt.attr_value.quality, str(evt.attr_value.value))
+ return "[%s] %s" % (evt.attr_value.quality, str(evt.attr_value.value))
elif isinstance(evt, AttrConfEventData):
cfg = evt.attr_conf
return "label='%s'; unit='%s'" % (cfg.label, cfg.unit)
elif isinstance(evt, DataReadyEventData):
return ""
+
def get_home():
"""
Find user's home directory if possible. Otherwise raise error.
@@ -979,9 +1072,9 @@ def get_home():
New in PyTango 7.1.4
"""
- path=''
+ path = ''
try:
- path=os.path.expanduser("~")
+ path = os.path.expanduser("~")
except:
pass
if not os.path.isdir(path):
@@ -996,6 +1089,7 @@ def get_home():
else:
raise RuntimeError('please define environment variable $HOME')
+
def _get_env_var(env_var_name):
"""
Returns the value for the given environment name
@@ -1013,10 +1107,10 @@ def _get_env_var(env_var_name):
New in PyTango 7.1.4
"""
-
+
if env_var_name in os.environ:
return os.environ[env_var_name]
-
+
fname = os.path.join(get_home(), '.tangorc')
if not os.path.exists(fname):
if os.name == 'posix':
@@ -1025,142 +1119,54 @@ def _get_env_var(env_var_name):
return None
for line in file(fname):
- strippedline = line.split('#',1)[0].strip()
-
+ strippedline = line.split('#', 1)[0].strip()
+
if not strippedline:
#empty line
continue
-
- tup = strippedline.split('=',1)
- if len(tup) !=2:
+
+ tup = strippedline.split('=', 1)
+ if len(tup) != 2:
# illegal line!
continue
-
+
key, val = map(str.strip, tup)
if key == env_var_name:
return val
+
def from_version_str_to_hex_str(version_str):
v = map(int, version_str.split('.'));
- return "0x%02d%02d%02d00" % (v[0],v[1],v[2])
+ return "0x%02d%02d%02d00" % (v[0], v[1], v[2])
+
def from_version_str_to_int(version_str):
return int(from_version_str_to_hex_str(version_str, 16))
-def __server_run(classes, args=None, msg_stream=sys.stderr, util=None):
- import PyTango
- if msg_stream is None:
- import io
- msg_stream = io.BytesIO()
-
- if args is None:
- args = sys.argv
-
- if util is None:
- util = PyTango.Util(args)
-
- if is_seq(classes):
- for klass_info in classes:
- if not hasattr(klass_info, '_api') or klass_info._api < 2:
- raise Exception("When giving a single class, it must implement API2 (see PyTango.api2)")
- klass_klass = klass_info._DeviceClass
- klass_name = klass_info._DeviceClassName
- klass = klass_info
- util.add_class(klass_klass, klass, klass_name)
- else:
- for klass_name, klass_info in classes.items():
- if is_seq(klass_info):
- klass_klass, klass = klass_info
- else:
- if not hasattr(klass_info, '_api') or klass_info._api < 2:
- raise Exception("When giving a single class, it must implement API2 (see PyTango.api2)")
- klass_klass = klass_info._DeviceClass
- klass_name = klass_info._DeviceClassName
- klass = klass_info
- util.add_class(klass_klass, klass, klass_name)
- u_instance = PyTango.Util.instance()
- u_instance.server_init()
- msg_stream.write("Ready to accept request\n")
- u_instance.server_run()
- return util
-
-def server_run(classes, args=None, msg_stream=sys.stderr, verbose=False, util=None):
- """Provides a simple way to run a tango server. It handles exceptions
- by writting a message to the msg_stream.
-
- The `classes` parameter can be either a sequence of :class:`~PyTango.api2.Device`
- classes or a dictionary where:
-
- * key is the tango class name
- * value is either:
- #. a :class:`~PyTango.api2.Device` class or
- #. a a sequence of two elements :class:`~PyTango.DeviceClass`, :class:`~PyTango.DeviceImpl`
-
- Example 1: registering and running a PowerSupply inheriting from :class:`~PyTango.api2.Device`::
-
- from PyTango import server_run
- from PyTango.api2 import Device, DeviceMeta
-
- class PowerSupply(Device):
- __metaclass__ = DeviceMeta
-
- server_run((PowerSupply,))
-
- Example 2: registering and running a MyServer defined by tango classes
- `MyServerClass` and `MyServer`::
-
- import PyTango
-
- class MyServer(PyTango.Device_4Impl):
- pass
-
- class MyServerClass(PyTango.DeviceClass):
- pass
-
- PyTango.server_run({"MyServer": (MyServerClass, MyServer)})
-
- :param classes:
- a sequence of :class:`~PyTango.api2.Device` classes or
- a dictionary where keyword is the tango class name and value is a
- sequence of Tango Device Class python class, and Tango Device python class
- :type classes: sequence or dict
-
- :param args:
- list of command line arguments [default: None, meaning use sys.argv]
- :type args: list
-
- :param msg_stream:
- stream where to put messages [default: sys.stderr]
-
- :param util:
- PyTango Util object [default: None meaning create a Util instance]
- :type util: :class:`~PyTango.Util`
-
- :return: The Util singleton object
- :rtype: :class:`~PyTango.Util`
-
- .. versionadded:: 8.0.0
-
- .. versionchanged:: 8.0.3
- Added `util` keyword parameter.
- Returns util object"""
-
- if msg_stream is None:
- import io
- msg_stream = io.BytesIO()
- write = msg_stream.write
- try:
- return __server_run(classes, args=args, util=util)
- write("Exiting:\n")
- except KeyboardInterrupt:
- write("Exiting: Keyboard interrupt\n")
- except DevFailed as df:
- write("Exiting: Server exited with PyTango.DevFailed:\n" + str(df) + "\n")
- if verbose:
- write(traceback.format_exc())
- except Exception as e:
- write("Exiting: Server exited with unforseen exception:\n" + str(e) + "\n")
- if verbose:
- write(traceback.format_exc())
- write("\nExited\n")
+
+def info():
+ import PyTango.constants
+
+ Compile = PyTango.constants.Compile
+ Runtime = PyTango.constants.Runtime
+
+ msg = """\
+PyTango {0.Release.version} {0.Release.version_info}
+PyTango compiled with:
+ Python : {1.PY_VERSION}
+ Numpy : {1.NUMPY_VERSION}
+ Tango : {1.TANGO_VERSION}
+ Boost : {1.BOOST_VERSION}
+
+PyTango runtime is:
+ Python : {2.PY_VERSION}
+ Numpy : {2.NUMPY_VERSION}
+ Tango : {2.TANGO_VERSION}
+ Boost : {2.BOOST_VERSION}
+
+PyTango running on:
+{2.UNAME}
+"""
+ msg = msg.format(PyTango, Compile, Runtime)
+ return msg
diff --git a/src/sip/AttributeInfo.sip b/src/sip/AttributeInfo.sip
new file mode 100644
index 0000000..42c3b4d
--- /dev/null
+++ b/src/sip/AttributeInfo.sip
@@ -0,0 +1,102 @@
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
+
+struct AttributeInfo : DeviceAttributeConfig
+{
+%TypeHeaderCode
+#include <tango.h>
+using namespace Tango;
+%End
+
+ DispLevel disp_level;
+
+ bool operator==(const AttributeInfo &);
+};
+
+%MappedType AttributeInfoList
+{
+%TypeHeaderCode
+#include <vector>
+#include <tango.h>
+using namespace Tango;
+%End
+
+%ConvertToTypeCode
+ // See if we are just being asked to check the type of the Python
+ // object.
+ if(sipIsErr == NULL)
+ {
+ bool aReturnFlag = PyList_Check(sipPy);
+ for(int i = 0; aReturnFlag && i < PySequence_Size(sipPy); ++i)
+ {
+ aReturnFlag = sipCanConvertToType(PySequence_ITEM(sipPy, i),
+ sipType_AttributeInfo,
+ SIP_NOT_NONE);
+ }
+ return aReturnFlag;
+ }
+
+ AttributeInfoList *attrInfoList = new AttributeInfoList();
+ for(int i = 0; i < PySequence_Size(sipPy); ++i)
+ {
+ int state;
+ AttributeInfo *aAttributeInfo = reinterpret_cast<AttributeInfo*>(
+ sipConvertToType(PySequence_ITEM(sipPy, i),
+ sipType_AttributeInfo, Py_None,
+ SIP_NOT_NONE,
+ &state, sipIsErr));
+ // Deal with any errors.
+ if (*sipIsErr)
+ {
+ sipReleaseType(aAttributeInfo, sipType_AttributeInfo, state);
+
+ // Tidy up.
+ delete attrInfoList;
+
+ // There is no temporary instance.
+ return 0;
+ }
+ attrInfoList->push_back(*aAttributeInfo);
+ sipReleaseType(aAttributeInfo, sipType_AttributeInfo, state);
+ }
+ *sipCppPtr = attrInfoList;
+ return sipGetState(sipTransferObj);
+%End
+
+%ConvertFromTypeCode
+ PyObject *l;
+
+ // Create the Python list of the correct length.
+ if (!(l = PyList_New(sipCpp->size())))
+ return NULL;
+
+ // Go through each element in the C++ instance and convert it to a
+ // wrapped AttributeInfo
+ int i = 0;
+ for(std::vector<AttributeInfo>::iterator j = sipCpp->begin();
+ j != sipCpp->end(); ++j, ++i)
+ {
+ AttributeInfo *aAttributeInfo = new AttributeInfo(*j);
+ PyObject *wobj;
+
+ if (!(wobj = sipConvertFromNewType(aAttributeInfo, sipType_AttributeInfo, sipTransferObj)))
+ {
+ // There was an error so garbage collect the Python list.
+ Py_DECREF(l);
+ return NULL;
+ }
+ PyList_SET_ITEM(l, i, wobj);
+ }
+ delete sipCpp;
+ return l;
+%End
+};
+
diff --git a/src/sip/CommandInfo.sip b/src/sip/CommandInfo.sip
new file mode 100644
index 0000000..0ff6ed6
--- /dev/null
+++ b/src/sip/CommandInfo.sip
@@ -0,0 +1,119 @@
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
+
+struct DevCommandInfo
+{
+%TypeHeaderCode
+#include <tango.h>
+using namespace Tango;
+%End
+
+ std::string cmd_name;
+ long cmd_tag;
+ long in_type;
+ long out_type;
+ std::string in_type_desc;
+ std::string out_type_desc;
+
+ bool operator==(const DevCommandInfo &);
+};
+
+struct CommandInfo : DevCommandInfo
+{
+%TypeHeaderCode
+#include <tango.h>
+using namespace Tango;
+%End
+
+ DispLevel disp_level;
+
+ bool operator==(const CommandInfo &);
+};
+
+%MappedType CommandInfoList
+{
+%TypeHeaderCode
+#include <vector>
+#include <tango.h>
+using namespace Tango;
+%End
+
+%ConvertToTypeCode
+ // See if we are just being asked to check the type of the Python
+ // object.
+ if(sipIsErr == NULL)
+ {
+ bool aReturnFlag = PyList_Check(sipPy);
+ for(int i = 0; aReturnFlag && i < PySequence_Size(sipPy); ++i)
+ {
+ aReturnFlag = sipCanConvertToType(PySequence_ITEM(sipPy, i),
+ sipType_CommandInfo,
+ SIP_NOT_NONE);
+ }
+ return aReturnFlag;
+ }
+
+ CommandInfoList *cmdInfoList = new CommandInfoList();
+ for(int i = 0; i < PySequence_Size(sipPy); ++i)
+ {
+ int state;
+ CommandInfo *aCommandInfo = reinterpret_cast<CommandInfo*>(
+ sipConvertToType(PySequence_ITEM(sipPy, i),
+ sipType_CommandInfo, Py_None,
+ SIP_NOT_NONE,
+ &state, sipIsErr));
+ // Deal with any errors.
+ if (*sipIsErr)
+ {
+ sipReleaseType(aCommandInfo, sipType_CommandInfo, state);
+
+ // Tidy up.
+ delete cmdInfoList;
+
+ // There is no temporary instance.
+ return 0;
+ }
+ cmdInfoList->push_back(*aCommandInfo);
+ sipReleaseType(aCommandInfo, sipType_CommandInfo, state);
+ }
+ *sipCppPtr = cmdInfoList;
+ return sipGetState(sipTransferObj);
+%End
+
+%ConvertFromTypeCode
+ PyObject *l;
+
+ // Create the Python list of the correct length.
+ if (!(l = PyList_New(sipCpp->size())))
+ return NULL;
+
+ // Go through each element in the C++ instance and convert it to a
+ // wrapped CommandInfo
+ int i = 0;
+ for(std::vector<CommandInfo>::iterator j = sipCpp->begin();
+ j != sipCpp->end(); ++j, ++i)
+ {
+ CommandInfo *aCommandInfo = new CommandInfo(*j);
+ PyObject *wobj;
+
+ if (!(wobj = sipConvertFromNewType(aCommandInfo, sipType_CommandInfo, sipTransferObj)))
+ {
+ // There was an error so garbage collect the Python list.
+ Py_DECREF(l);
+ return NULL;
+ }
+ PyList_SET_ITEM(l, i, wobj);
+ }
+ delete sipCpp;
+ return l;
+%End
+};
+
diff --git a/src/sip/database.sip b/src/sip/Database.sip
similarity index 87%
rename from src/sip/database.sip
rename to src/sip/Database.sip
index 205ea81..93e1848 100644
--- a/src/sip/database.sip
+++ b/src/sip/Database.sip
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
class Database : Connection {
diff --git a/src/sip/DbData.sip b/src/sip/DbData.sip
new file mode 100644
index 0000000..3ba4be2
--- /dev/null
+++ b/src/sip/DbData.sip
@@ -0,0 +1,12 @@
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
+
+
diff --git a/src/sip/DbDatum.sip b/src/sip/DbDatum.sip
new file mode 100644
index 0000000..6319f96
--- /dev/null
+++ b/src/sip/DbDatum.sip
@@ -0,0 +1,187 @@
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
+
+//
+// DbDatum - data object for sending and receiving data from the
+// TANGO database api
+//
+class DbDatum
+{
+
+%TypeHeaderCode
+#include <tango.h>
+using namespace Tango;
+%End
+
+public :
+ enum except_flags
+ {
+ isempty_flag,
+ wrongtype_flag,
+ numFlags
+ };
+
+ std::string name;
+ std::vector<std::string> value_string;
+
+//
+// constructor methods
+//
+ DbDatum();
+ DbDatum (const char *);
+ ~DbDatum();
+ DbDatum(const DbDatum &);
+// DbDatum &operator=(const DbDatum &);
+
+// size_t size();
+ bool is_empty();
+
+//// void exceptions(bitset<numFlags> fl) { exceptions_flags = fl;}
+//// bitset<numFlags> exceptions() {return exceptions_flags;}
+ void reset_exceptions(except_flags fl);
+ void set_exceptions(except_flags fl);
+
+//
+// insert methods
+//
+/*
+ void operator << (bool);
+ void operator << (short);
+ void operator << (unsigned char);
+ void operator << (unsigned short);
+ void operator << (DevLong);
+ void operator << (DevULong);
+ void operator << (DevLong64);
+ void operator << (DevULong64);
+ void operator << (float);
+ void operator << (double);
+ void operator << (char *);
+// void operator << (char *&);
+ void operator << (const char *);
+// void operator << (const char *&);
+ void operator << (std::string&);
+
+ void operator << (vector<std::string>&);
+ void operator << (vector<short>&);
+ void operator << (vector<unsigned short>&);
+ void operator << (vector<DevLong>&);
+ void operator << (vector<DevULong>&);
+ void operator << (vector<DevLong64>&);
+ void operator << (vector<DevULong64>&);
+ void operator << (vector<float>&);
+ void operator << (vector<double>&);
+
+//
+// extract methods
+//
+
+ bool operator >> (bool&);
+ bool operator >> (short&);
+ bool operator >> (unsigned char&);
+ bool operator >> (unsigned short&);
+ bool operator >> (DevLong&);
+ bool operator >> (DevULong&);
+ bool operator >> (DevLong64&);
+ bool operator >> (DevULong64&);
+ bool operator >> (float&);
+ bool operator >> (double&);
+ bool operator >> (const char*&);
+ bool operator >> (std::string&);
+
+ bool operator >> (vector<std::string>&);
+ bool operator >> (vector<short>&);
+ bool operator >> (vector<unsigned short>&);
+ bool operator >> (vector<DevLong>&);
+ bool operator >> (vector<DevULong>&);
+ bool operator >> (vector<DevLong64>&);
+ bool operator >> (vector<DevULong64>&);
+ bool operator >> (vector<float>&);
+ bool operator >> (vector<double>&);
+*/
+};
+
+%MappedType DbData
+{
+%TypeHeaderCode
+#include <vector>
+#include <tango.h>
+using namespace Tango;
+%End
+
+%ConvertToTypeCode
+ // See if we are just being asked to check the type of the Python
+ // object.
+ if(sipIsErr == NULL)
+ {
+ bool aReturnFlag = PyList_Check(sipPy);
+ for(int i = 0; aReturnFlag && i < PySequence_Size(sipPy); ++i)
+ {
+ aReturnFlag = sipCanConvertToType(PySequence_ITEM(sipPy, i),
+ sipType_DbDatum,
+ SIP_NOT_NONE);
+ }
+ return aReturnFlag;
+ }
+
+ DbData *dbDatumList = new DbData();
+ for(int i = 0; i < PySequence_Size(sipPy); ++i)
+ {
+ int state;
+ DbDatum *aDbDatum = reinterpret_cast<DbDatum*>(
+ sipConvertToType(PySequence_ITEM(sipPy, i),
+ sipType_DbDatum, Py_None,
+ SIP_NOT_NONE,
+ &state, sipIsErr));
+ // Deal with any errors.
+ if (*sipIsErr)
+ {
+ sipReleaseType(aDbDatum, sipType_DbDatum, state);
+
+ // Tidy up.
+ delete dbDatumList;
+
+ // There is no temporary instance.
+ return 0;
+ }
+ dbDatumList->push_back(*aDbDatum);
+ sipReleaseType(aDbDatum, sipType_DbDatum, state);
+ }
+ *sipCppPtr = dbDatumList;
+ return sipGetState(sipTransferObj);
+%End
+
+%ConvertFromTypeCode
+ PyObject *l;
+
+ // Create the Python list of the correct length.
+ if (!(l = PyList_New(sipCpp->size())))
+ return NULL;
+
+ // Go through each element in the C++ instance and convert it to a
+ // wrapped DbDatum
+ int i = 0;
+ for(std::vector<DbDatum>::iterator j = sipCpp->begin();
+ j != sipCpp->end(); ++j, ++i)
+ {
+ DbDatum *aDbDatum = new DbDatum(*j);
+ PyObject *wobj;
+
+ if (!(wobj = sipConvertFromNewType(aDbDatum, sipType_DbDatum, sipTransferObj)))
+ {
+ // There was an error so garbage collect the Python list.
+ Py_DECREF(l);
+ return NULL;
+ }
+ PyList_SET_ITEM(l, i, wobj);
+ }
+ return l;
+%End
+};
diff --git a/src/sip/DbDevImportInfo.sip b/src/sip/DbDevImportInfo.sip
new file mode 100644
index 0000000..f96c1eb
--- /dev/null
+++ b/src/sip/DbDevImportInfo.sip
@@ -0,0 +1,25 @@
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
+
+class DbDevImportInfo
+{
+
+%TypeHeaderCode
+#include <tango.h>
+using namespace Tango;
+%End
+
+public :
+ std::string name;
+ long exported;
+ std::string ior;
+ std::string version;
+};
\ No newline at end of file
diff --git a/src/sip/DbDevInfo.sip b/src/sip/DbDevInfo.sip
new file mode 100644
index 0000000..98b6d4a
--- /dev/null
+++ b/src/sip/DbDevInfo.sip
@@ -0,0 +1,24 @@
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
+
+class DbDevInfo
+{
+
+%TypeHeaderCode
+#include <tango.h>
+using namespace Tango;
+%End
+
+public :
+ std::string name;
+ std::string _class;
+ std::string server;
+};
\ No newline at end of file
diff --git a/src/sip/DeviceAttributeConfig.sip b/src/sip/DeviceAttributeConfig.sip
new file mode 100644
index 0000000..d405b5e
--- /dev/null
+++ b/src/sip/DeviceAttributeConfig.sip
@@ -0,0 +1,38 @@
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
+
+struct DeviceAttributeConfig
+{
+%TypeHeaderCode
+#include <tango.h>
+using namespace Tango;
+%End
+ std::string name;
+ AttrWriteType writable;
+ AttrDataFormat data_format;
+ int data_type;
+ int max_dim_x;
+ int max_dim_y;
+ std::string description;
+ std::string label;
+ std::string unit;
+ std::string standard_unit;
+ std::string display_unit;
+ std::string format;
+ std::string min_value;
+ std::string max_value;
+ std::string min_alarm;
+ std::string max_alarm;
+ std::string writable_attr_name;
+ std::vector<std::string> extensions;
+
+ bool operator==(const DeviceAttributeConfig &);
+};
diff --git a/src/sip/DeviceInfo.sip b/src/sip/DeviceInfo.sip
new file mode 100644
index 0000000..f565562
--- /dev/null
+++ b/src/sip/DeviceInfo.sip
@@ -0,0 +1,24 @@
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
+
+struct DeviceInfo
+{
+%TypeHeaderCode
+#include <tango.h>
+using namespace Tango;
+%End
+ std::string dev_class;
+ std::string server_id;
+ std::string server_host;
+ long server_version;
+ std::string doc_url;
+ std::string dev_type;
+};
diff --git a/src/sip/DeviceProxy.sip b/src/sip/DeviceProxy.sip
new file mode 100644
index 0000000..a39aaec
--- /dev/null
+++ b/src/sip/DeviceProxy.sip
@@ -0,0 +1,221 @@
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
+
+class DeviceProxy : Connection {
+
+%TypeHeaderCode
+#include <tango.h>
+using namespace Tango;
+%End
+
+protected:
+ virtual std::string get_corba_name(bool);
+ virtual std::string build_corba_name();
+ virtual int get_lock_ctr();
+ virtual void set_lock_ctr(int);
+
+public:
+ DeviceProxy();
+ DeviceProxy(const char *, bool ch_access);
+ DeviceProxy(const char *);
+
+ DeviceProxy(const DeviceProxy &);
+// DeviceProxy & operator=(const DeviceProxy &);
+
+//
+// general methods
+//
+
+ virtual const DeviceInfo & info();
+ virtual std::string dev_name();
+ virtual void parse_name(std::string &);
+ virtual Database *get_device_db();
+
+ virtual std::string status();
+ virtual DevState state();
+ virtual std::string adm_name();
+ virtual std::string description();
+ virtual std::string name();
+ virtual std::string alias();
+
+ virtual int ping();
+
+ virtual std::vector<std::string>* black_box(int);
+
+//
+// device methods
+//
+ virtual CommandInfo command_query(std::string);
+ virtual CommandInfoList* command_list_query();
+
+
+ virtual DbDevImportInfo import_info();
+//
+// property methods
+//
+ virtual void get_property(std::string& /In/, DbData& /Out/);
+ virtual void get_property(std::vector<std::string> /In/, DbData& /Out/);
+ virtual void get_property(DbData&);
+ virtual void put_property(DbData& /In/);
+ virtual void delete_property(std::string& /In/);
+ virtual void delete_property(std::vector<std::string>& /In/);
+ virtual void delete_property(DbData& /In/);
+ virtual void get_property_list(const std::string &, std::vector<std::string> & /Out/);
+
+//
+// attribute methods
+//
+ virtual std::vector<std::string> *get_attribute_list();
+
+ virtual AttributeInfoList *get_attribute_config(std::vector<std::string>&);
+ /*
+ virtual AttributeInfoListEx *get_attribute_config_ex(std::vector<std::string>&);
+ virtual AttributeInfoEx get_attribute_config(const std::string &);
+
+ virtual AttributeInfoEx attribute_query(std::string name) {return get_attribute_config(name);}
+ virtual AttributeInfoList *attribute_list_query();
+ virtual AttributeInfoListEx *attribute_list_query_ex();
+
+ virtual void set_attribute_config(AttributeInfoList &);
+ virtual void set_attribute_config(AttributeInfoListEx &);
+
+ virtual DeviceAttribute read_attribute(std::string&);
+ virtual DeviceAttribute read_attribute(const char *at) {std::string str(at);return read_attribute(str);}
+ void read_attribute(const char *,DeviceAttribute &);
+ void read_attribute(std::string &at,DeviceAttribute &da) {read_attribute(at.c_str(),da);}
+ virtual std::vector<DeviceAttribute> *read_attributes(std::vector<std::string>&);
+
+ virtual void write_attribute(DeviceAttribute&);
+ virtual void write_attributes(std::vector<DeviceAttribute>&);
+
+ virtual DeviceAttribute write_read_attribute(DeviceAttribute &);
+
+//
+// history methods
+//
+ virtual std::vector<DeviceDataHistory> *command_history(std::string &,int);
+ virtual std::vector<DeviceDataHistory> *command_history(const char *na,int n)
+ {std::string str(na);return command_history(str,n);}
+
+ virtual std::vector<DeviceAttributeHistory> *attribute_history(std::string &,int);
+ virtual std::vector<DeviceAttributeHistory> *attribute_history(const char *na,int n)
+ {std::string str(na);return attribute_history(str,n);}
+//
+// Polling administration methods
+//
+ virtual std::vector<std::string> *polling_status();
+
+ virtual void poll_command(std::string &, int);
+ virtual void poll_command(const char *na, int per) {std::string tmp(na);poll_command(tmp,per);}
+ virtual void poll_attribute(std::string &, int);
+ virtual void poll_attribute(const char *na, int per) {std::string tmp(na);poll_attribute(tmp,per);}
+
+ virtual int get_command_poll_period(std::string &);
+ virtual int get_command_poll_period(const char *na)
+ {std::string tmp(na);return get_command_poll_period(tmp);}
+ virtual int get_attribute_poll_period(std::string &);
+ virtual int get_attribute_poll_period(const char *na)
+ {std::string tmp(na);return get_attribute_poll_period(tmp);}
+
+ virtual bool is_command_polled(std::string &);
+ virtual bool is_command_polled(const char *na) {std::string tmp(na);return is_command_polled(tmp);}
+ virtual bool is_attribute_polled(std::string &);
+ virtual bool is_attribute_polled(const char *na) {std::string tmp(na);return is_attribute_polled(tmp);}
+
+ virtual void stop_poll_command(std::string &);
+ virtual void stop_poll_command(const char *na) {std::string tmp(na);stop_poll_command(tmp);}
+ virtual void stop_poll_attribute(std::string &);
+ virtual void stop_poll_attribute(const char *na) {std::string tmp(na);stop_poll_attribute(tmp);}
+//
+// Asynchronous methods
+//
+ virtual long read_attribute_asynch(const char *na) {std::string tmp(na);return read_attribute_asynch(tmp);}
+ virtual long read_attribute_asynch(std::string &att_name);
+ virtual long read_attributes_asynch(std::vector <std::string> &);
+
+ virtual std::vector<DeviceAttribute> *read_attributes_reply(long);
+ virtual std::vector<DeviceAttribute> *read_attributes_reply(long,long);
+ virtual DeviceAttribute *read_attribute_reply(long);
+ virtual DeviceAttribute *read_attribute_reply(long,long);
+
+ virtual long write_attribute_asynch(DeviceAttribute &);
+ virtual long write_attributes_asynch(std::vector<DeviceAttribute> &);
+
+ virtual void write_attributes_reply(long);
+ virtual void write_attributes_reply(long,long);
+ virtual void write_attribute_reply(long id) {write_attributes_reply(id);}
+ virtual void write_attribute_reply(long to,long id) {write_attributes_reply(to,id);}
+
+ virtual long pending_asynch_call(asyn_req_type req)
+ {if (req == POLLING)return pasyn_ctr;
+ else if (req==CALL_BACK) return pasyn_cb_ctr;
+ else return (pasyn_ctr + pasyn_cb_ctr);}
+
+ virtual void read_attributes_asynch(std::vector<std::string> &,CallBack &);
+ virtual void read_attribute_asynch(const char *na,CallBack &cb) {std::string tmp(na);read_attribute_asynch(tmp,cb);}
+ virtual void read_attribute_asynch(std::string &,CallBack &);
+
+ virtual void write_attribute_asynch(DeviceAttribute &,CallBack &);
+ virtual void write_attributes_asynch(std::vector<DeviceAttribute> &,CallBack &);
+//
+// Logging administration methods
+//
+#ifdef TANGO_HAS_LOG4TANGO
+ virtual void add_logging_target(const std::string &target_type_name);
+ virtual void add_logging_target(const char *target_type_name)
+ {add_logging_target(std::string(target_type_name));}
+
+ virtual void remove_logging_target(const std::string &target_type_name);
+ virtual void remove_logging_target(const char *target_type_name)
+ {remove_logging_target(std::string(target_type_name));}
+
+ virtual std::vector<std::string> get_logging_target (void);
+ virtual int get_logging_level (void);
+ virtual void set_logging_level (int level);
+#endif // TANGO_HAS_LOG4TANGO
+//
+// Event methods
+//
+ virtual int subscribe_event(const std::string &attr_name, EventType event, CallBack *,
+ const std::vector<std::string> &filters); // For compatibility with Tango < 8
+ virtual int subscribe_event(const std::string &attr_name, EventType event, CallBack *,
+ const std::vector<std::string> &filters, bool stateless); // For compatibility with Tango < 8
+ virtual int subscribe_event(const std::string &attr_name, EventType event, int event_queue_size,
+ const std::vector<std::string> &filters, bool stateless = false); // For compatibility with Tango < 8
+
+ virtual int subscribe_event(const std::string &attr_name, EventType event, CallBack *);
+ virtual int subscribe_event(const std::string &attr_name, EventType event, CallBack *,bool stateless);
+ virtual int subscribe_event(const std::string &attr_name, EventType event, int event_queue_size,bool stateless = false);
+
+ virtual void unsubscribe_event(int event_id);
+//
+// Methods to access data in event queues
+//
+ virtual void get_events (int event_id, EventDataList &event_list);
+ virtual void get_events (int event_id, AttrConfEventDataList &event_list);
+ virtual void get_events (int event_id, DataReadyEventDataList &event_list);
+ virtual void get_events (int event_id, CallBack *cb);
+ virtual int event_queue_size(int event_id);
+ virtual TimeVal get_last_event_date(int event_id);
+ virtual bool is_event_queue_empty(int event_id);
+
+//
+// Locking methods
+//
+ virtual void lock(int lock_validity=DEFAULT_LOCK_VALIDITY);
+ virtual void unlock(bool force=false);
+ virtual std::string locking_status();
+ virtual bool is_locked();
+ virtual bool is_locked_by_me();
+ virtual bool get_locker(LockerInfo &);
+*/
+};
+
diff --git a/src/sip/Makefile b/src/sip/Makefile
new file mode 100644
index 0000000..6820d9c
--- /dev/null
+++ b/src/sip/Makefile
@@ -0,0 +1,58 @@
+TARGET = Tango.so
+OFILES = sipTangocmodule.o sipTangoDatabase.o sipTangoDeviceProxy.o sipTangoConnection.o sipTangoDbDevImportInfo.o sipTangoDbDevInfo.o sipTangoDbDatum.o sipTangoCommandInfoList.o sipTangoCommandInfo.o sipTangoDevCommandInfo.o sipTangostdvector1800.o sipTangostdvector0100stdstring.o sipTangostdstring.o
+HFILES = sipAPITango.h
+
+CC = gcc
+CXX = g++
+LINK = g++
+CPPFLAGS = -DNDEBUG -I. -I/usr/include/python2.6
+CFLAGS = -O2 -g -fPIC -Wall -W
+CXXFLAGS = -std=c++0x -O2 -g -fPIC -Wall -W
+LFLAGS = -z defs -shared -Wl,--version-script=Tango.exp
+LIBS = -ltango -llog4tango -lzmq -lomniORB4 -lomniDynamic4 -lomnithread -lCOS4 -lpython2.6
+.SUFFIXES: .c .o .cpp .cc .cxx .C
+
+
+.cpp.o:
+ $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -o $@ $<
+
+.cc.o:
+ $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -o $@ $<
+
+.cxx.o:
+ $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -o $@ $<
+
+.C.o:
+ $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -o $@ $<
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
+
+all: $(TARGET)
+
+$(OFILES): $(HFILES)
+
+$(TARGET): $(OFILES)
+ @echo '{ global: initTango; local: *; };' > Tango.exp
+ $(LINK) $(LFLAGS) -o $(TARGET) $(OFILES) $(LIBS)
+
+install: $(TARGET)
+ @test -d $(DESTDIR)/usr/lib/python2.6/dist-packages || mkdir -p $(DESTDIR)/usr/lib/python2.6/dist-packages
+ cp -f $(TARGET) $(DESTDIR)/usr/lib/python2.6/dist-packages/$(TARGET)
+
+clean:
+ -rm -f $(TARGET)
+ -rm -f sipTangocmodule.o
+ -rm -f sipTangoDatabase.o
+ -rm -f sipTangoDeviceProxy.o
+ -rm -f sipTangoConnection.o
+ -rm -f sipTangoDbDevImportInfo.o
+ -rm -f sipTangoDbDevInfo.o
+ -rm -f sipTangoDbDatum.o
+ -rm -f sipTangoCommandInfoList.o
+ -rm -f sipTangoCommandInfo.o
+ -rm -f sipTangoDevCommandInfo.o
+ -rm -f sipTangostdvector1800.o
+ -rm -f sipTangostdvector0100stdstring.o
+ -rm -f sipTangostdstring.o
+ -rm -f Tango.exp
diff --git a/src/sip/Tango.sip b/src/sip/Tango.sip
new file mode 100644
index 0000000..e1ec7a2
--- /dev/null
+++ b/src/sip/Tango.sip
@@ -0,0 +1,47 @@
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
+
+%Module Tango 008001000
+
+%Timeline { TANGO_7_2 TANGO_8_0 TANGO_8_1 }
+
+%Platforms {WIN32_PLATFORM POSIX_PLATFORM MACOS_PLATFORM}
+
+%Include std_utils.sip
+%Include constants.sip
+%Include CommandInfo.sip
+%Include DeviceInfo.sip
+%Include DeviceAttributeConfig.sip
+%Include AttributeInfo.sip
+%Include DbDatum.sip
+%Include DbDevInfo.sip
+%Include DbDevImportInfo.sip
+%Include connection.sip
+%Include DeviceProxy.sip
+%Include Database.sip
+
+%PostInitialisationCode
+
+ PyObject* init_tango = PyImport_ImportModule("__init_tango");
+ if (init_tango == NULL)
+ {
+ if (!PyErr_Occurred())
+ {
+
+ }
+ return;
+ }
+ PyObject* init_name = PyString_FromString("init");
+ PyObject* ret = PyObject_CallMethodObjArgs(init_tango, init_name, sipModule, sipModuleDict, NULL);
+ Py_DECREF(init_name);
+ Py_DECREF(ret);
+ Py_DECREF(init_tango);
+%End
diff --git a/src/sip/__init_tango.py b/src/sip/__init_tango.py
new file mode 100644
index 0000000..ea3a53c
--- /dev/null
+++ b/src/sip/__init_tango.py
@@ -0,0 +1,65 @@
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
+
+import collections
+
+def __inc_param(obj, name):
+ ret = not name.startswith('_')
+ ret &= not name in ('except_flags',)
+ ret &= not isinstance(getattr(obj, name), collections.Callable)
+ return ret
+
+def __single_param(obj, param_name, f=repr, fmt='%s = %s'):
+ param_value = getattr(obj, param_name)
+ return fmt % (param_name, f(param_value))
+
+def __struct_params_s(obj, separator=', ', f=repr, fmt='%s = %s'):
+ """method wrapper for printing all elements of a struct"""
+ s = separator.join([__single_param(obj, n, f, fmt) for n in dir(obj) if __inc_param(obj, n)])
+ return s
+
+def __struct_params_repr(obj):
+ """method wrapper for representing all elements of a struct"""
+ return __struct_params_s(obj)
+
+def __struct_params_str(obj, fmt, f=repr):
+ """method wrapper for printing all elements of a struct."""
+ return __struct_params_s(obj, '\n', f=f, fmt=fmt)
+
+def __repr__Struct(self):
+ """repr method for struct"""
+ return '%s(%s)' % (self.__class__.__name__, __struct_params_repr(self))
+
+def __str__Struct_Helper(self, f=repr):
+ """str method for struct"""
+ attrs = [ n for n in dir(self) if __inc_param(self, n)]
+ fmt = attrs and '%%%ds=%%s' % max(map(len, attrs)) or "%s = %s"
+ return '%s(\n%s)\n' % (self.__class__.__name__, __struct_params_str(self, fmt, f))
+
+def __str__Struct(self):
+ return __str__Struct_Helper(self, f=repr)
+
+def __registerStructStr(Tango):
+ """helper method to register str and repr methods for structures"""
+ structs = (Tango.DeviceInfo, Tango.DbDevImportInfo, Tango.DbDatum,
+ Tango.AttributeInfo)
+
+ for struct in structs:
+ struct.__str__ = __str__Struct
+ struct.__repr__ = __repr__Struct
+
+def __pprint_init(Tango):
+ __registerStructStr(Tango)
+
+
+def init(Tango, Tangodict):
+ __pprint_init(Tango)
+ return 1
diff --git a/src/sip/configure.py b/src/sip/configure.py
index 81e945e..ea03e84 100644
--- a/src/sip/configure.py
+++ b/src/sip/configure.py
@@ -1,26 +1,56 @@
import os
+import sys
import sipconfig
# The name of the SIP build file generated by SIP and used by the build
# system.
-build_file = "tango.sbf"
+
+this_dir = os.path.dirname(os.path.abspath(__file__))
+out_dir = os.path.join(this_dir, 'out')
+
+name = "Tango"
+sip_file = os.path.join(this_dir, name + ".sip")
+build_file = os.path.join(out_dir , name + ".sbf")
# Get the SIP configuration information.
config = sipconfig.Configuration()
+
# Run SIP to generate the code.
-os.system(" ".join([config.sip_bin, "-c", ".", "-b", build_file, "tango.sip"]))
+cmd = " ".join([config.sip_bin,
+ "-e" , # Enable support for exceptions.
+ "-g", # Always release and reaquire the GIL.
+ "-w", # Enable warning messages
+ "-c", out_dir,
+ "-b", build_file,
+ sip_file])
+print cmd
+ret = os.system(cmd)
+
+if ret:
+ print "sip error: exiting..."
+ sys.exit(ret)
# Create the Makefile.
-makefile = sipconfig.SIPModuleMakefile(config, build_file)
+makefile = sipconfig.SIPModuleMakefile(config, build_file,
+ dir=out_dir,
+ install_dir=this_dir)
+
+python_lib = "python{v[0]}.{v[1]}".format(v=sys.version_info)
# Add the library we are wrapping. The name doesn't include any platform
# specific prefixes or extensions (e.g. the "lib" prefix on UNIX, or the
# ".dll" extension on Windows).
-makefile.extra_libs = ["tango", "zmq"]
-makefile.extra_lib_dirs = ["/home/tcoutinho/.local/lib"]
-makefile.extra_include_dirs = ["/home/tcoutinho/.local/include", "/home/tcoutinho/.local/include/tango"]
+makefile.extra_libs = ["tango", "log4tango", "zmq",
+ "omniORB4", "omniDynamic4", "omnithread", "COS4",
+ python_lib]
+makefile.extra_lib_dirs = [] #["/home/tcoutinho/.local/lib"]
+makefile.extra_include_dirs = [] #["/home/tcoutinho/.local/include", "/home/tcoutinho/.local/include/tango"]
makefile.extra_cxxflags = ["-std=c++0x"]
+# see all undefined references
+makefile.extra_lflags = ['-z defs']
+
# Generate the Makefile itself.
makefile.generate()
+
diff --git a/src/sip/connection.sip b/src/sip/connection.sip
index fa05444..9df9c92 100644
--- a/src/sip/connection.sip
+++ b/src/sip/connection.sip
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
class Connection {
diff --git a/src/sip/constants.sip b/src/sip/constants.sip
index 9a513aa..fa3eea9 100644
--- a/src/sip/constants.sip
+++ b/src/sip/constants.sip
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
%ModuleHeaderCode
#include <tango.h>
@@ -102,8 +90,6 @@ enum LockCmdCode {
LOCK_EXIT
};
-
-
enum LogLevel {
LOG_OFF,
LOG_FATAL,
diff --git a/src/sip/dbdatum.sip b/src/sip/dbdatum.sip
deleted file mode 100644
index 0bea30f..0000000
--- a/src/sip/dbdatum.sip
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
-
-//
-// DbDatum - data object for sending and receiving data from the
-// TANGO database api
-//
-class DbDatum
-{
-
-%TypeHeaderCode
-#include <tango.h>
-using namespace Tango;
-%End
-
-public :
- enum except_flags
- {
- isempty_flag,
- wrongtype_flag,
- numFlags
- };
-
- std::string name;
- std::vector<std::string> value_string;
-
-//
-// constructor methods
-//
- DbDatum();
- DbDatum (std::string);
- DbDatum (const char *);
- ~DbDatum();
- DbDatum(const DbDatum &);
-// DbDatum &operator=(const DbDatum &);
-
-// size_t size();
- bool is_empty();
-
-//// void exceptions(bitset<numFlags> fl) { exceptions_flags = fl;}
-//// bitset<numFlags> exceptions() {return exceptions_flags;}
- void reset_exceptions(except_flags fl);
- void set_exceptions(except_flags fl);
-
-//
-// insert methods
-//
-/*
- void operator << (bool);
- void operator << (short);
- void operator << (unsigned char);
- void operator << (unsigned short);
- void operator << (DevLong);
- void operator << (DevULong);
- void operator << (DevLong64);
- void operator << (DevULong64);
- void operator << (float);
- void operator << (double);
- void operator << (char *);
-// void operator << (char *&);
- void operator << (const char *);
-// void operator << (const char *&);
- void operator << (std::string&);
-
- void operator << (vector<std::string>&);
- void operator << (vector<short>&);
- void operator << (vector<unsigned short>&);
- void operator << (vector<DevLong>&);
- void operator << (vector<DevULong>&);
- void operator << (vector<DevLong64>&);
- void operator << (vector<DevULong64>&);
- void operator << (vector<float>&);
- void operator << (vector<double>&);
-
-//
-// extract methods
-//
-
- bool operator >> (bool&);
- bool operator >> (short&);
- bool operator >> (unsigned char&);
- bool operator >> (unsigned short&);
- bool operator >> (DevLong&);
- bool operator >> (DevULong&);
- bool operator >> (DevLong64&);
- bool operator >> (DevULong64&);
- bool operator >> (float&);
- bool operator >> (double&);
- bool operator >> (const char*&);
- bool operator >> (std::string&);
-
- bool operator >> (vector<std::string>&);
- bool operator >> (vector<short>&);
- bool operator >> (vector<unsigned short>&);
- bool operator >> (vector<DevLong>&);
- bool operator >> (vector<DevULong>&);
- bool operator >> (vector<DevLong64>&);
- bool operator >> (vector<DevULong64>&);
- bool operator >> (vector<float>&);
- bool operator >> (vector<double>&);
-*/
-};
-
diff --git a/src/sip/deviceproxy.sip b/src/sip/deviceproxy.sip
deleted file mode 100644
index e6f7543..0000000
--- a/src/sip/deviceproxy.sip
+++ /dev/null
@@ -1,232 +0,0 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
-
-class DeviceProxy : Connection {
-
-%TypeHeaderCode
-#include <tango.h>
-using namespace Tango;
-%End
-
-protected:
- virtual std::string get_corba_name(bool);
- virtual std::string build_corba_name();
- virtual int get_lock_ctr();
- virtual void set_lock_ctr(int);
-
-public:
- DeviceProxy();
- DeviceProxy(const char *, bool ch_access);
- DeviceProxy(const char *);
-
- DeviceProxy(const DeviceProxy &);
-// DeviceProxy & operator=(const DeviceProxy &);
-
-//
-// general methods
-//
-
-// virtual DeviceInfo const &info();
- virtual std::string dev_name();
- virtual void parse_name(std::string &);
- virtual Database *get_device_db();
-
- virtual std::string status();
- virtual DevState state();
- virtual std::string adm_name();
- virtual std::string description();
- virtual std::string name();
- virtual std::string alias();
-
- virtual int ping();
-
- virtual std::vector<std::string> *black_box(int);
-
-/*
-
-//
-// device methods
-//
- virtual CommandInfo command_query(std::string);
- virtual CommandInfoList *command_list_query();
-
- virtual DbDevImportInfo import_info();
-//
-// property methods
-//
- virtual void get_property(std::string&, DbData&);
- virtual void get_property(vector<std::string>&, DbData&);
- virtual void get_property(DbData&);
- virtual void put_property(DbData&);
- virtual void delete_property(std::string&);
- virtual void delete_property(vector<std::string>&);
- virtual void delete_property(DbData&);
- virtual void get_property_list(const std::string &,vector<std::string> &);
-//
-// attribute methods
-//
- virtual vector<std::string> *get_attribute_list();
-
- virtual AttributeInfoList *get_attribute_config(vector<std::string>&);
- virtual AttributeInfoListEx *get_attribute_config_ex(vector<std::string>&);
- virtual AttributeInfoEx get_attribute_config(const std::string &);
-
- virtual AttributeInfoEx attribute_query(std::string name) {return get_attribute_config(name);}
- virtual AttributeInfoList *attribute_list_query();
- virtual AttributeInfoListEx *attribute_list_query_ex();
-
- virtual void set_attribute_config(AttributeInfoList &);
- virtual void set_attribute_config(AttributeInfoListEx &);
-
- virtual DeviceAttribute read_attribute(std::string&);
- virtual DeviceAttribute read_attribute(const char *at) {std::string str(at);return read_attribute(str);}
- void read_attribute(const char *,DeviceAttribute &);
- void read_attribute(std::string &at,DeviceAttribute &da) {read_attribute(at.c_str(),da);}
- virtual vector<DeviceAttribute> *read_attributes(vector<std::string>&);
-
- virtual void write_attribute(DeviceAttribute&);
- virtual void write_attributes(vector<DeviceAttribute>&);
-
- virtual DeviceAttribute write_read_attribute(DeviceAttribute &);
-
-//
-// history methods
-//
- virtual vector<DeviceDataHistory> *command_history(std::string &,int);
- virtual vector<DeviceDataHistory> *command_history(const char *na,int n)
- {std::string str(na);return command_history(str,n);}
-
- virtual vector<DeviceAttributeHistory> *attribute_history(std::string &,int);
- virtual vector<DeviceAttributeHistory> *attribute_history(const char *na,int n)
- {std::string str(na);return attribute_history(str,n);}
-//
-// Polling administration methods
-//
- virtual vector<std::string> *polling_status();
-
- virtual void poll_command(std::string &, int);
- virtual void poll_command(const char *na, int per) {std::string tmp(na);poll_command(tmp,per);}
- virtual void poll_attribute(std::string &, int);
- virtual void poll_attribute(const char *na, int per) {std::string tmp(na);poll_attribute(tmp,per);}
-
- virtual int get_command_poll_period(std::string &);
- virtual int get_command_poll_period(const char *na)
- {std::string tmp(na);return get_command_poll_period(tmp);}
- virtual int get_attribute_poll_period(std::string &);
- virtual int get_attribute_poll_period(const char *na)
- {std::string tmp(na);return get_attribute_poll_period(tmp);}
-
- virtual bool is_command_polled(std::string &);
- virtual bool is_command_polled(const char *na) {std::string tmp(na);return is_command_polled(tmp);}
- virtual bool is_attribute_polled(std::string &);
- virtual bool is_attribute_polled(const char *na) {std::string tmp(na);return is_attribute_polled(tmp);}
-
- virtual void stop_poll_command(std::string &);
- virtual void stop_poll_command(const char *na) {std::string tmp(na);stop_poll_command(tmp);}
- virtual void stop_poll_attribute(std::string &);
- virtual void stop_poll_attribute(const char *na) {std::string tmp(na);stop_poll_attribute(tmp);}
-//
-// Asynchronous methods
-//
- virtual long read_attribute_asynch(const char *na) {std::string tmp(na);return read_attribute_asynch(tmp);}
- virtual long read_attribute_asynch(std::string &att_name);
- virtual long read_attributes_asynch(vector <std::string> &);
-
- virtual vector<DeviceAttribute> *read_attributes_reply(long);
- virtual vector<DeviceAttribute> *read_attributes_reply(long,long);
- virtual DeviceAttribute *read_attribute_reply(long);
- virtual DeviceAttribute *read_attribute_reply(long,long);
-
- virtual long write_attribute_asynch(DeviceAttribute &);
- virtual long write_attributes_asynch(vector<DeviceAttribute> &);
-
- virtual void write_attributes_reply(long);
- virtual void write_attributes_reply(long,long);
- virtual void write_attribute_reply(long id) {write_attributes_reply(id);}
- virtual void write_attribute_reply(long to,long id) {write_attributes_reply(to,id);}
-
- virtual long pending_asynch_call(asyn_req_type req)
- {if (req == POLLING)return pasyn_ctr;
- else if (req==CALL_BACK) return pasyn_cb_ctr;
- else return (pasyn_ctr + pasyn_cb_ctr);}
-
- virtual void read_attributes_asynch(vector<std::string> &,CallBack &);
- virtual void read_attribute_asynch(const char *na,CallBack &cb) {std::string tmp(na);read_attribute_asynch(tmp,cb);}
- virtual void read_attribute_asynch(std::string &,CallBack &);
-
- virtual void write_attribute_asynch(DeviceAttribute &,CallBack &);
- virtual void write_attributes_asynch(vector<DeviceAttribute> &,CallBack &);
-//
-// Logging administration methods
-//
-#ifdef TANGO_HAS_LOG4TANGO
- virtual void add_logging_target(const std::string &target_type_name);
- virtual void add_logging_target(const char *target_type_name)
- {add_logging_target(std::string(target_type_name));}
-
- virtual void remove_logging_target(const std::string &target_type_name);
- virtual void remove_logging_target(const char *target_type_name)
- {remove_logging_target(std::string(target_type_name));}
-
- virtual vector<std::string> get_logging_target (void);
- virtual int get_logging_level (void);
- virtual void set_logging_level (int level);
-#endif // TANGO_HAS_LOG4TANGO
-//
-// Event methods
-//
- virtual int subscribe_event(const std::string &attr_name, EventType event, CallBack *,
- const vector<std::string> &filters); // For compatibility with Tango < 8
- virtual int subscribe_event(const std::string &attr_name, EventType event, CallBack *,
- const vector<std::string> &filters, bool stateless); // For compatibility with Tango < 8
- virtual int subscribe_event(const std::string &attr_name, EventType event, int event_queue_size,
- const vector<std::string> &filters, bool stateless = false); // For compatibility with Tango < 8
-
- virtual int subscribe_event(const std::string &attr_name, EventType event, CallBack *);
- virtual int subscribe_event(const std::string &attr_name, EventType event, CallBack *,bool stateless);
- virtual int subscribe_event(const std::string &attr_name, EventType event, int event_queue_size,bool stateless = false);
-
- virtual void unsubscribe_event(int event_id);
-//
-// Methods to access data in event queues
-//
- virtual void get_events (int event_id, EventDataList &event_list);
- virtual void get_events (int event_id, AttrConfEventDataList &event_list);
- virtual void get_events (int event_id, DataReadyEventDataList &event_list);
- virtual void get_events (int event_id, CallBack *cb);
- virtual int event_queue_size(int event_id);
- virtual TimeVal get_last_event_date(int event_id);
- virtual bool is_event_queue_empty(int event_id);
-
-//
-// Locking methods
-//
- virtual void lock(int lock_validity=DEFAULT_LOCK_VALIDITY);
- virtual void unlock(bool force=false);
- virtual std::string locking_status();
- virtual bool is_locked();
- virtual bool is_locked_by_me();
- virtual bool get_locker(LockerInfo &);
-*/
-};
-
diff --git a/src/boost/python/release.py b/src/sip/release.py
similarity index 63%
copy from src/boost/python/release.py
copy to src/sip/release.py
index 40e8af4..a1bcc27 100644
--- a/src/boost/python/release.py
+++ b/src/sip/release.py
@@ -1,25 +1,13 @@
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
"""
This is an internal PyTango module.
@@ -52,10 +40,10 @@ class Release:
- keywords : (seq<str>) list of keywords
- license : (str) the license"""
name = 'PyTango'
- version_info = (8, 0, 3, 'final', 0)
+ version_info = (8, 1, 0, 'dev', 0)
version = '.'.join(map(str, version_info[:3]))
version_long = version + ''.join(map(str, version_info[3:]))
- version_description = 'This version implements the C++ Tango 8.0 API.'
+ version_description = 'This version implements the C++ Tango 8.1 API.'
version_number = int(version.replace('.',''))
description = 'A python binding for the Tango control system'
long_description = 'This module implements the Python Tango Device API ' \
@@ -65,6 +53,6 @@ class Release:
author_lines = "\n".join([ "%s <%s>" % x for x in authors.values()])
url = 'http://www.tango-controls.org/static/PyTango/'
download_url = 'http://pypi.python.org/packages/source/P/PyTango'
- platform = ['Linux', 'Windows XP/Vista/7']
+ platform = ['Linux', 'Windows XP/Vista/7/8']
keywords = ['Tango', 'CORBA', 'binding']
diff --git a/src/sip/setup.cfg b/src/sip/setup.cfg
new file mode 100644
index 0000000..0e215a3
--- /dev/null
+++ b/src/sip/setup.cfg
@@ -0,0 +1,2 @@
+[build_ext]
+sip-opts = -e -g -w
\ No newline at end of file
diff --git a/src/sip/setup.py b/src/sip/setup.py
new file mode 100644
index 0000000..06ffc78
--- /dev/null
+++ b/src/sip/setup.py
@@ -0,0 +1,297 @@
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
+
+import os
+import sys
+import imp
+import struct
+import platform
+import subprocess
+
+from distutils.core import setup, Extension
+from distutils.unixccompiler import UnixCCompiler
+from distutils.version import StrictVersion as V
+
+import sipdistutils
+
+
+def abspath(*path):
+ """A method to determine absolute path for a given relative path to the
+ directory where this setup.py script is located"""
+ setup_dir = os.path.dirname(os.path.abspath(__file__))
+ return os.path.join(setup_dir, *path)
+
+
+def get_release_info():
+ import release
+ return release.Release
+
+
+def uniquify(seq):
+ no_dups = []
+ [ no_dups.append(i) for i in seq if not no_dups.count(i) ]
+ return no_dups
+
+
+class build_ext(sipdistutils.build_ext):
+
+ def build_extensions(self):
+ self.use_cpp_0x = False
+ if isinstance(self.compiler, UnixCCompiler):
+ compiler_pars = self.compiler.compiler_so
+ while '-Wstrict-prototypes' in compiler_pars:
+ del compiler_pars[compiler_pars.index('-Wstrict-prototypes')]
+ #self.compiler.compiler_so = " ".join(compiler_pars)
+
+ # mimic tango check to activate C++0x extension
+ compiler = self.compiler.compiler
+ pipe = subprocess.Popen(compiler + ["-dumpversion"], stdout=subprocess.PIPE).stdout
+ gcc_ver = pipe.readlines()[0].decode().strip()
+ if V(gcc_ver) >= V("4.3.3"):
+ self.use_cpp_0x = True
+ sipdistutils.build_ext.build_extensions(self)
+
+ def build_extension(self, ext):
+ if self.use_cpp_0x:
+ ext.extra_compile_args += ['-std=c++0x']
+ ext.define_macros += [ ('PYTANGO_HAS_UNIQUE_PTR', '1') ]
+ sipdistutils.build_ext.build_extension(self, ext)
+
+
+def main():
+ ZMQ_ROOT = LOG4TANGO_ROOT = OMNI_ROOT = TANGO_ROOT = '/usr'
+
+ TANGO_ROOT = os.environ.get('TANGO_ROOT', TANGO_ROOT)
+ OMNI_ROOT = os.environ.get('OMNI_ROOT', OMNI_ROOT)
+ LOG4TANGO_ROOT = os.environ.get('LOG4TANGO_ROOT', LOG4TANGO_ROOT)
+ ZMQ_ROOT = os.environ.get('ZMQ_ROOT', ZMQ_ROOT)
+
+ Release = get_release_info()
+
+ author = Release.authors['Coutinho']
+
+ please_debug = False
+
+ packages = [
+ 'Tango',
+ ]
+
+ provides = [
+ 'Tango',
+ ]
+
+ requires = [
+ 'sip (>=4.10)',
+ 'numpy (>=1.1)'
+ ]
+
+ classifiers = [
+ 'Development Status :: 2 - Pre-Alpha',
+ 'Environment :: Other Environment',
+ 'Intended Audience :: Developers',
+ 'License :: OSI Approved :: GNU Library or Lesser General Public License v3 (LGPLv3)',
+ 'Natural Language :: English',
+ 'Operating System :: Microsoft :: Windows',
+ 'Operating System :: POSIX',
+ 'Operating System :: POSIX :: Linux',
+ 'Operating System :: Unix',
+ 'Operating System :: MacOS',
+ 'Programming Language :: C',
+ 'Programming Language :: Python',
+ 'Programming Language :: Python :: 3',
+ 'Topic :: Scientific/Engineering',
+ 'Topic :: Software Development :: Libraries',
+ ]
+
+ #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+ # include directories
+ #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+
+ include_dirs = [ ]
+
+ _tango_root_inc = os.path.join(TANGO_ROOT, 'include')
+ include_dirs.append(_tango_root_inc)
+
+ # $TANGO_ROOT/include/tango exists since tango 7.2.0
+ # we changed the PyTango code include statements from:
+ # #include <tango.h> to:
+ # #include <tango/tango.h>
+ # However tango itself complains that it doesn't know his own header files
+ # if we don't add the $TANGO_ROOT/include/tango directory to the path. So we do it
+ # here
+ _tango_root_inc = os.path.join(_tango_root_inc, 'tango')
+ if os.path.isdir(_tango_root_inc):
+ include_dirs.append(_tango_root_inc)
+
+ include_dirs.append(os.path.join(OMNI_ROOT, 'include'))
+ include_dirs.append(os.path.join(LOG4TANGO_ROOT, 'include'))
+
+ #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+ # library directories
+ #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
+
+ libraries = [
+ 'tango',
+ 'log4tango',
+ 'zmq',
+ ]
+
+ extra_compile_args = []
+
+ extra_link_args = []
+
+ macros = []
+
+ library_dirs = []
+ for f in (TANGO_ROOT, LOG4TANGO_ROOT, ZMQ_ROOT):
+ is64 = 8 * struct.calcsize("P") == 64
+ d = os.path.join(f, 'lib')
+ if is64:
+ d = os.path.join(f, 'lib64')
+ try:
+ if not os.stat(d): raise Exception('%s_doesnt_exist' % d)
+ except: d = os.path.join(f, 'lib')
+ library_dirs.append(d)
+
+ if os.name == 'nt':
+ include_dirs += [ ]
+
+ if please_debug:
+ libraries += [
+ #'libboost_python-vc80-mt-1_38', Boost in windows autodetects the
+ #proper library to link itself with...
+ 'omniORB414d_rt',
+ 'omniDynamic414d_rt',
+ 'omnithread34d_rt',
+ 'COS414d_rt',
+ ]
+ extra_compile_args += []
+ extra_link_args += ['/DEBUG']
+ macros += [ ('_DEBUG', None) ]
+ else:
+ libraries += [
+ #'libboost_python-vc80-mt-1_38', Boost in windows autodetects the
+ #proper library to link itself with...
+ 'omniORB414_rt',
+ 'omniDynamic414_rt',
+ 'omnithread34_rt',
+ 'COS414_rt',
+ ]
+
+ library_dirs += [ os.path.join(OMNI_ROOT, 'lib', 'x86_win32') ]
+
+ extra_compile_args += [
+ '/EHsc',
+ '/wd4005', # supress redefinition of HAVE_STRFTIME between python and omniORB
+ '/wd4996', # same as /D_SCL_SECURE_NO_WARNINGS
+ '/wd4250', # supress base class inheritance warning
+ ]
+
+ extra_link_args += []
+
+ macros += [
+ #('_WINDOWS', None),
+ #('_USRDLL', None),
+ #('_TANGO_LIB', None),
+ #('JPG_USE_ASM', None),
+ ('LOG4TANGO_HAS_DLL', None),
+ ('TANGO_HAS_DLL', None),
+ ('WIN32', None),
+ ]
+
+ else:
+ if please_debug:
+ extra_compile_args += ['-g', '-O0']
+ extra_link_args += ['-g' , '-O0']
+
+ libraries += [
+ 'pthread',
+ 'rt',
+ 'dl',
+ 'omniORB4',
+ 'omniDynamic4',
+ 'omnithread',
+ 'COS4',
+ ]
+
+ is64 = 8 * struct.calcsize("P") == 64
+ omni_lib = os.path.join(OMNI_ROOT, 'lib')
+ if is64:
+ omni_lib = os.path.join(OMNI_ROOT, 'lib64')
+ try:
+ if not os.stat(d): raise Exception('%s_doesnt_exist' % d)
+ except:
+ omni_lib = os.path.join(OMNI_ROOT, 'lib')
+ library_dirs += [ omni_lib ]
+
+
+ # Note for PyTango developers:
+ # Compilation time can be greatly reduced by compiling the file
+ # src/precompiled_header.hpp as src/precompiled_header.hpp.gch
+ # and then uncommenting this line. Someday maybe this will be
+ # automated...
+ extra_compile_args += [
+# '-includesrc/precompiled_header.hpp',
+ ]
+
+ #if not please_debug:
+ # extra_compile_args += [ '-g0' ]
+
+ extra_link_args += [
+ '-Wl,-h',
+ '-Wl,--strip-all',
+ ]
+
+ macros += []
+
+ include_dirs = uniquify(include_dirs)
+ library_dirs = uniquify(library_dirs)
+ src_dir = abspath('.')
+ _cppfiles = [ os.path.join(src_dir, fname) for fname in os.listdir(src_dir) if fname.endswith('.cpp') ]
+ _cppfiles.sort()
+ sources = ["Tango.sip"] + _cppfiles
+
+ cmdclass = {'build_ext': build_ext}
+
+ _tango = Extension(
+ name='Tango',
+ sources=sources,
+ include_dirs=include_dirs,
+ library_dirs=library_dirs,
+ libraries=libraries,
+ define_macros=macros,
+ extra_compile_args=extra_compile_args,
+ extra_link_args=extra_link_args,
+ language='c++',
+ depends=[])
+
+ dist = setup(
+ name='Tango',
+ version=Release.version,
+ description=Release.description,
+ long_description=Release.long_description,
+ author=author[0],
+ author_email=author[1],
+ url=Release.url,
+ download_url=Release.download_url,
+ platforms=Release.platform,
+ license=Release.license,
+ packages=packages,
+ package_dir={ 'Tango' : abspath(".") },
+ classifiers=classifiers,
+ provides=provides,
+ keywords=Release.keywords,
+ requires=requires,
+ ext_modules=[_tango],
+ cmdclass=cmdclass)
+
+if __name__ == "__main__":
+ main()
diff --git a/src/sip/stdutils.sip b/src/sip/std_utils.sip
similarity index 57%
rename from src/sip/stdutils.sip
rename to src/sip/std_utils.sip
index aec4e07..174f1bf 100644
--- a/src/sip/stdutils.sip
+++ b/src/sip/std_utils.sip
@@ -1,25 +1,13 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
%MappedType std::string
{
@@ -39,9 +27,9 @@ if (sipIsErr == NULL)
%ConvertFromTypeCode
return PyString_FromStringAndSize(sipCpp->data(),sipCpp->length());
%End
-
};
+
%MappedType std::vector<std::string>
{
%TypeHeaderCode
@@ -52,17 +40,17 @@ return PyString_FromStringAndSize(sipCpp->data(),sipCpp->length());
%ConvertToTypeCode
if (sipIsErr == NULL)
{
-bool aReturnFlag = PyList_Check(sipPy);
-for(int i = 0;aReturnFlag && i < PyList_Size(sipPy);++i)
- aReturnFlag = PyString_Check(PyList_GET_ITEM(sipPy,i));
-return aReturnFlag;
+ bool aReturnFlag = PyList_Check(sipPy);
+ for(int i = 0;aReturnFlag && i < PyList_Size(sipPy);++i)
+ aReturnFlag = PyString_Check(PyList_GET_ITEM(sipPy,i));
+ return aReturnFlag;
}
*sipCppPtr = new std::vector<std::string>(PyList_Size(sipPy));
for(int i = 0;i < PyList_Size(sipPy);++i)
- (*sipCppPtr)->operator[](i) = PyString_AsString(PyList_GET_ITEM(sipPy,i));
+ (*sipCppPtr)->operator[](i) = PyString_AsString(PyList_GET_ITEM(sipPy,i));
- return sipGetState(sipTransferObj);
+return sipGetState(sipTransferObj);
%End
%ConvertFromTypeCode
@@ -70,13 +58,13 @@ PyObject* aReturnListPt = PyList_New(sipCpp->size());
std::vector<std::string>::iterator vIter = sipCpp->begin();
for(int i = 0;vIter != sipCpp->end();++vIter,++i)
- PyList_SET_ITEM(aReturnListPt,i,PyString_FromStringAndSize(vIter->data(),vIter->length()));
+ PyList_SET_ITEM(aReturnListPt,i,PyString_FromStringAndSize(vIter->data(),vIter->length()));
return aReturnListPt;
%End
-
};
+
%MappedType std::vector<int>
{
%TypeHeaderCode
diff --git a/src/sip/tango.sip b/src/sip/tango.sip
deleted file mode 100644
index 25d4a4b..0000000
--- a/src/sip/tango.sip
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
-
- This file is part of PyTango, a python binding for Tango
-
- http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-
- Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-
- PyTango is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- PyTango is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-
-*******************************************************************************/
-
-%Module(name=Tango, version=0801)
-
-%Include stdutils.sip
-%Include constants.sip
-%Include connection.sip
-%Include dbdatum.sip
-%Include database.sip
-%Include deviceproxy.sip
diff --git a/src/swig/Makefile b/src/swig/Makefile
new file mode 100644
index 0000000..6555b4a
--- /dev/null
+++ b/src/swig/Makefile
@@ -0,0 +1,106 @@
+
+# -----------------------------------------------------------------------------
+# Common stuff
+# -----------------------------------------------------------------------------
+COMMON_OUT = _common
+
+CSCC = cscc
+CC = c++
+LD = c++
+
+SRC = src
+SWIG = swig -c++
+
+INTERFACE_FILE=tango.i
+
+# -----------------------------------------------------------------------------
+# PERL stuff
+# -----------------------------------------------------------------------------
+PERL_FLAGS =$(shell perl -MConfig -e 'print join(" ", @Config{qw(ccflags optimize cccdlflags)}, "-I$$Config{archlib}/CORE")')
+PERL_LINK_FLAGS = $(shell perl -MConfig -e 'print $$Config{lddlflags}')
+PERL_OUT = _perl
+PERL_SWIG = $(SWIG) -perl5 -outdir $(PERL_OUT)
+PERL_CC = $(CC) $(PERL_FLAGS)
+PERL_LD = $(CC) $(PERL_LINK_FLAGS)
+
+# -----------------------------------------------------------------------------
+# Python stuff
+# -----------------------------------------------------------------------------
+PY_FLAGS = -g -fPIC -Wall $(shell python-config --includes) -std=c++0x
+PY_LINK_FLAGS = -ltango -llog4tango -lpthread -lrt -ldl -lomniORB4 -lomniDynamic4 -lomnithread -lCOS4 -lzmq
+PY_OUT = _python
+PY_SWIG = $(SWIG) -python -outdir $(PY_OUT)
+PY_CC = $(CC) $(PY_FLAGS)
+PY_LD = $(LD) $(PY_LINK_FLAGS) -shared
+
+# -----------------------------------------------------------------------------
+# C# stuff
+# -----------------------------------------------------------------------------
+CSHARP_FLAGS = -fPIC
+CSHARP_OUT = _csharp
+CSHARP_SWIG = $(SWIG) -csharp -outdir $(CSHARP_OUT)
+CSHARP_CC = $(CC) $(CSHARP_FLAGS)
+CSHARP_LD = $(CC) -shared
+
+# -----------------------------------------------------------------------------
+# TCL stuff
+# -----------------------------------------------------------------------------
+TCL_FLAGS = -I/usr/include/tcl -fPIC
+TCL_OUT = _tcl
+TCL_SWIG = $(SWIG) -tcl -outdir $(TCL_OUT)
+TCL_CC = $(CC) $(TCL_FLAGS)
+TCL_LD = $(LD) -shared
+
+# -----------------------------------------------------------------------------
+# GO stuff
+# -----------------------------------------------------------------------------
+GO_FLAGS = -fPIC
+GO_OUT = _go
+GO_SWIG = $(SWIG) -go -intgosize 32 -outdir $(GO_OUT)
+GO_CC = $(CC) $(GO_FLAGS)
+GO_LD = $(CC) -shared
+
+# -----------------------------------------------------------------------------
+# commands
+# -----------------------------------------------------------------------------
+
+all: perl python csharp tcl
+
+common:
+ mkdir -p $(COMMON_OUT)
+
+perl: common
+ mkdir -p $(PERL_OUT)
+ $(PERL_SWIG) -o $(PERL_OUT)/tango_wrap.cpp $(INTERFACE_FILE)
+ $(PERL_CC) -c $(PERL_OUT)/tango_wrap.cpp -o $(PERL_OUT)/tango_wrap.o
+ $(PERL_LD) $(COMMON_OUT)/tango_wrap.o -o $(PERL_OUT)/_Tango.so
+
+python: common
+ mkdir -p $(PY_OUT)
+ $(PY_SWIG) -o $(PY_OUT)/tango_wrap.cpp $(INTERFACE_FILE)
+ $(PY_CC) -c $(PY_OUT)/tango_wrap.cpp -o $(PY_OUT)/tango_wrap.o
+ $(PY_LD) $(PY_OUT)/tango_wrap.o -o $(PY_OUT)/_Tango.so
+
+csharp: common
+ mkdir -p $(CSHARP_OUT)
+ $(CSHARP_SWIG) -o $(CSHARP_OUT)/example_wrap.c $(INTERFACE_FILE)
+ $(CSHARP_CC) -c $(CSHARP_OUT)/example_wrap.c -o $(CSHARP_OUT)/example_wrap.o
+ $(CSHARP_LD) $(COMMON_OUT)/example.o $(CSHARP_OUT)/example_wrap.o -o $(CSHARP_OUT)/libexample.so
+
+tcl: common
+ mkdir -p $(TCL_OUT)
+ $(TCL_SWIG) -o $(TCL_OUT)/example_wrap.c $(INTERFACE_FILE)
+ $(TCL_CC) -c $(TCL_OUT)/example_wrap.c -o $(TCL_OUT)/example_wrap.o
+ $(TCL_LD) $(COMMON_OUT)/example.o $(TCL_OUT)/example_wrap.o -o $(TCL_OUT)/example.so
+
+go: common
+ mkdir -p $(GO_OUT)
+ $(GO_SWIG) -o $(GO_OUT)/example_wrap.c $(INTERFACE_FILE)
+ $(GO_CC) -c $(GO_OUT)/example_wrap.c -o $(GO_OUT)/example_wrap.o $(GO_FLAGS)
+ $(GO_LD) $(COMMON_OUT)/example.o $(GO_OUT)/example_wrap.o -o $(GO_OUT)/example.so
+ 6g -o $(GO_OUT)/example.6 $(GO_OUT)/example.go
+ 6c -I $(GOROOT)/pkg/linux_amd64 -o $(GO_OUT)/example_gc.6 $(GO_OUT)/example_gc.c
+ pack grc $(GO_OUT)/example.a $(GO_OUT)/example.6 $(GO_OUT)/example_gc.6
+
+clean:
+ rm -rf $(COMMON_OUT) $(PERL_OUT) $(PY_OUT) $(CSHARP_OUT) $(TCL_OUT) $(GO_OUT)
diff --git a/src/swig/deviceproxy.i b/src/swig/deviceproxy.i
new file mode 100644
index 0000000..357b25f
--- /dev/null
+++ b/src/swig/deviceproxy.i
@@ -0,0 +1,224 @@
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
+
+ %{
+ #include <tango.h>
+ %}
+
+namespace Tango
+{
+
+class DeviceProxy: public Connection
+{
+public:
+ %newobject black_box;
+ %newobject command_list_query;
+ %newobject get_attribute_list;
+ %newobject get_attribute_config;
+ %newobject get_attribute_ex;
+ %newobject attribute_list_query;
+ %newobject attribute_list_query_ex;
+ %newobject polling_status;
+
+ DeviceProxy();
+ DeviceProxy(std::string &name, CORBA::ORB *orb=NULL);
+ DeviceProxy(std::string &name, bool ch_access, CORBA::ORB *orb=NULL);
+ DeviceProxy(const char *, bool ch_access, CORBA::ORB *orb=NULL);
+ DeviceProxy(const char *, CORBA::ORB *orb=NULL);
+
+ DeviceProxy(const DeviceProxy &);
+ DeviceProxy & operator=(const DeviceProxy &);
+ virtual ~DeviceProxy();
+
+//
+// general methods
+//
+
+ virtual Tango::DeviceInfo const &info();
+ virtual inline std::string dev_name() { return device_name; }
+ virtual void parse_name(std::string &);
+ virtual Tango::Database *get_device_db();
+
+ virtual std::string status();
+ virtual Tango::DevState state();
+ virtual std::string adm_name();
+ virtual std::string description();
+ virtual std::string name();
+ virtual std::string alias();
+
+ int get_tango_lib_version();
+
+ virtual int ping();
+ virtual std::vector<std::string> *black_box(int);
+//
+// device methods
+//
+ virtual Tango::CommandInfo command_query(std::string);
+ virtual Tango::CommandInfoList *command_list_query();
+
+ virtual Tango::DbDevImportInfo import_info();
+//
+// property methods
+//
+ virtual void get_property(std::string&, Tango::DbData&);
+ virtual void get_property(std::vector<std::string>&, Tango::DbData&);
+ virtual void get_property(Tango::DbData&);
+ virtual void put_property(Tango::DbData&);
+ virtual void delete_property(std::string&);
+ virtual void delete_property(std::vector<std::string>&);
+ virtual void delete_property(Tango::DbData&);
+ virtual void get_property_list(const std::string &,std::vector<std::string> &);
+//
+// attribute methods
+//
+ virtual std::vector<std::string> *get_attribute_list(); /* MEMORY LEAK */
+
+ virtual Tango::AttributeInfoList *get_attribute_config(std::vector<std::string>&);
+ virtual Tango::AttributeInfoListEx *get_attribute_config_ex(std::vector<std::string>&);
+ virtual Tango::AttributeInfoEx get_attribute_config(const std::string &);
+
+ virtual Tango::AttributeInfoEx attribute_query(std::string name);
+ virtual Tango::AttributeInfoList *attribute_list_query();
+ virtual Tango::AttributeInfoListEx *attribute_list_query_ex();
+
+ virtual void set_attribute_config(Tango::AttributeInfoList &);
+ virtual void set_attribute_config(Tango::AttributeInfoListEx &);
+
+ virtual Tango::DeviceAttribute read_attribute(std::string&);
+ virtual Tango::DeviceAttribute read_attribute(const char *at);
+ void read_attribute(const char *, Tango::DeviceAttribute &);
+ void read_attribute(std::string &at, Tango::DeviceAttribute &da);
+ virtual std::vector<Tango::DeviceAttribute> *read_attributes(std::vector<std::string>&);
+
+ virtual void write_attribute(Tango::DeviceAttribute&);
+ virtual void write_attributes(std::vector<Tango::DeviceAttribute>&);
+
+ virtual Tango::DeviceAttribute write_read_attribute(Tango::DeviceAttribute &);
+
+//
+// history methods
+//
+ virtual std::vector<Tango::DeviceDataHistory> *command_history(std::string &,int);
+ virtual std::vector<Tango::DeviceDataHistory> *command_history(const char *na,int n);
+
+ virtual std::vector<Tango::DeviceAttributeHistory> *attribute_history(std::string &,int);
+ virtual std::vector<Tango::DeviceAttributeHistory> *attribute_history(const char *na,int n);
+//
+// Polling administration methods
+//
+ virtual std::vector<std::string> *polling_status();
+
+ virtual void poll_command(std::string &, int);
+ virtual void poll_command(const char *na, int per);
+ virtual void poll_attribute(std::string &, int);
+ virtual void poll_attribute(const char *na, int per);
+
+ virtual int get_command_poll_period(std::string &);
+ virtual int get_command_poll_period(const char *na)
+ {std::string tmp(na);return get_command_poll_period(tmp);}
+ virtual int get_attribute_poll_period(std::string &);
+ virtual int get_attribute_poll_period(const char *na)
+ {std::string tmp(na);return get_attribute_poll_period(tmp);}
+
+ virtual bool is_command_polled(std::string &);
+ virtual bool is_command_polled(const char *na);
+ virtual bool is_attribute_polled(std::string &);
+ virtual bool is_attribute_polled(const char *na);
+
+ virtual void stop_poll_command(std::string &);
+ virtual void stop_poll_command(const char *na);
+ virtual void stop_poll_attribute(std::string &);
+ virtual void stop_poll_attribute(const char *na);
+//
+// Asynchronous methods
+//
+ virtual long read_attribute_asynch(const char *na);
+ virtual long read_attribute_asynch(std::string &att_name);
+ virtual long read_attributes_asynch(std::vector <std::string> &);
+
+ virtual std::vector<Tango::DeviceAttribute> *read_attributes_reply(long);
+ virtual std::vector<Tango::DeviceAttribute> *read_attributes_reply(long,long);
+ virtual Tango::DeviceAttribute *read_attribute_reply(long);
+ virtual Tango::DeviceAttribute *read_attribute_reply(long,long);
+
+ virtual long write_attribute_asynch(Tango::DeviceAttribute &);
+ virtual long write_attributes_asynch(std::vector<Tango::DeviceAttribute> &);
+
+ virtual void write_attributes_reply(long);
+ virtual void write_attributes_reply(long,long);
+ virtual void write_attribute_reply(long id) {write_attributes_reply(id);}
+ virtual void write_attribute_reply(long to,long id) {write_attributes_reply(to,id);}
+
+ virtual long pending_asynch_call(Tango::asyn_req_type req)
+ {if (req == POLLING)return pasyn_ctr;
+ else if (req==CALL_BACK) return pasyn_cb_ctr;
+ else return (pasyn_ctr + pasyn_cb_ctr);}
+
+ virtual void read_attributes_asynch(std::vector<std::string> &, Tango::CallBack &);
+ virtual void read_attribute_asynch(const char *na, Tango::CallBack &cb);
+ virtual void read_attribute_asynch(std::string &, Tango::CallBack &);
+
+ virtual void write_attribute_asynch(Tango::DeviceAttribute &, Tango::CallBack &);
+ virtual void write_attributes_asynch(std::vector<Tango::DeviceAttribute> &, Tango::CallBack &);
+//
+// Logging administration methods
+//
+#ifdef TANGO_HAS_LOG4TANGO
+ virtual void add_logging_target(const std::string &target_type_name);
+ virtual void add_logging_target(const char *target_type_name)
+ {add_logging_target(std::string(target_type_name));}
+
+ virtual void remove_logging_target(const std::string &target_type_name);
+ virtual void remove_logging_target(const char *target_type_name)
+ {remove_logging_target(std::string(target_type_name));}
+
+ virtual std::vector<std::string> get_logging_target (void);
+ virtual int get_logging_level (void);
+ virtual void set_logging_level (int level);
+#endif // TANGO_HAS_LOG4TANGO
+//
+// Event methods
+//
+ virtual int subscribe_event(const std::string &attr_name, Tango::EventType event, Tango::CallBack *,
+ const std::vector<std::string> &filters); // For compatibility with Tango < 8
+ virtual int subscribe_event(const std::string &attr_name, Tango::EventType event, Tango::CallBack *,
+ const std::vector<std::string> &filters, bool stateless); // For compatibility with Tango < 8
+ virtual int subscribe_event(const std::string &attr_name, Tango::EventType event, int event_queue_size,
+ const std::vector<std::string> &filters, bool stateless = false); // For compatibility with Tango < 8
+
+ virtual int subscribe_event(const std::string &attr_name, Tango::EventType event, Tango::CallBack *);
+ virtual int subscribe_event(const std::string &attr_name, Tango::EventType event, Tango::CallBack *,bool stateless);
+ virtual int subscribe_event(const std::string &attr_name, Tango::EventType event, int event_queue_size,bool stateless = false);
+
+ virtual void unsubscribe_event(int event_id);
+//
+// Methods to access data in event queues
+//
+ virtual void get_events (int event_id, Tango::EventDataList &event_list);
+ virtual void get_events (int event_id, Tango::AttrConfEventDataList &event_list);
+ virtual void get_events (int event_id, Tango::DataReadyEventDataList &event_list);
+ virtual void get_events (int event_id, Tango::CallBack *cb);
+ virtual int event_queue_size(int event_id);
+ virtual Tango::TimeVal get_last_event_date(int event_id);
+ virtual bool is_event_queue_empty(int event_id);
+
+//
+// Locking methods
+//
+ virtual void lock(int lock_validity=DEFAULT_LOCK_VALIDITY);
+ virtual void unlock(bool force=false);
+ virtual std::string locking_status();
+ virtual bool is_locked();
+ virtual bool is_locked_by_me();
+ virtual bool get_locker(Tango::LockerInfo &);
+};
+
+}
\ No newline at end of file
diff --git a/src/swig/tango.i b/src/swig/tango.i
new file mode 100644
index 0000000..8e8b50e
--- /dev/null
+++ b/src/swig/tango.i
@@ -0,0 +1,21 @@
+/******************************************************************************
+ This file is part of PyTango (http://www.tinyurl.com/PyTango)
+
+ Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+ Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+
+ Distributed under the terms of the GNU Lesser General Public License,
+ either version 3 of the License, or (at your option) any later version.
+ See LICENSE.txt for more info.
+******************************************************************************/
+
+%module Tango
+
+%include "std_string.i"
+%include "std_vector.i"
+
+namespace std {
+ %template(vector_string) vector<string>;
+};
+
+%include "deviceproxy.i"
\ No newline at end of file
diff --git a/win/PyTango_VS10/PyTango.props b/win/PyTango_VS10/PyTango.props
index 4adfc86..5b64e88 100755
--- a/win/PyTango_VS10/PyTango.props
+++ b/win/PyTango_VS10/PyTango.props
@@ -3,9 +3,14 @@
<PropertyGroup Label="UserMacros">
<PyTangoBaseFile>_PyTango</PyTangoBaseFile>
<TangoMajorVer>8</TangoMajorVer>
- <TangoMinorVer>0</TangoMinorVer>
- <TangoPatchVer>5</TangoPatchVer>
+ <TangoMinorVer>1</TangoMinorVer>
+ <TangoPatchVer>2</TangoPatchVer>
<TangoVer>$(TangoMajorVer).$(TangoMinorVer).$(TangoPatchVer)</TangoVer>
+ <PyTangoMajorVer>8</PyTangoMajorVer>
+ <PyTangoMinorVer>1</PyTangoMinorVer>
+ <PyTangoPatchVer>1</PyTangoPatchVer>
+ <PyTangoVer>$(PyTangoMajorVer).$(PyTangoMinorVer).$(PyTangoPatchVer)</PyTangoVer>
+
<BoostMajorVer>1</BoostMajorVer>
<BoostMinorVer>53</BoostMinorVer>
<BoostPatchVer>0</BoostPatchVer>
@@ -25,7 +30,7 @@
<PyTangoCompileOptions>-Zm200 /MP2 /bigobj</PyTangoCompileOptions>
<BaseDir>$(ProjectDir)..\..</BaseDir>
<RelPrefixDir>$(Configuration)_$(Platform)_msvc$(VCVer)</RelPrefixDir>
- <BaseBuildDir>c:\temp\pytango\build</BaseBuildDir>
+ <BaseBuildDir>c:\temp\pytango\build_$(PyTangoVer)_tg$(TangoVer)_boost$(BoostVer)</BaseBuildDir>
<BaseBuildLibDir>$(BaseBuildDir)\lib</BaseBuildLibDir>
<BaseTempDir>$(BaseBuildDir)\temp</BaseTempDir>
<BaseDistDir>$(BaseBuildDir)\dist</BaseDistDir>
diff --git a/win/PyTango_VS10/PyTango.sln b/win/PyTango_VS10/PyTango.sln
index fd1541f..7d9e6ac 100755
--- a/win/PyTango_VS10/PyTango.sln
+++ b/win/PyTango_VS10/PyTango.sln
@@ -15,16 +15,16 @@ Global
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopyshared_tangoshared_release|Win32.ActiveCfg = py33_bopyshared_tangoshared_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopyshared_tangoshared_release|Win32.Build.0 = py33_bopyshared_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopyshared_tangoshared_release|x64.ActiveCfg = py33_bopyshared_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopyshared_tangoshared_release|x64.Build.0 = py33_bopyshared_tangoshared_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopyshared_tangoshared_release|x64.ActiveCfg = py33_bopyshared_tangoshared_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopyshared_tangoshared_release|x64.Build.0 = py33_bopyshared_tangoshared_release|x64
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangoshared_release|Win32.ActiveCfg = py33_bopystatic_tangoshared_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangoshared_release|Win32.Build.0 = py33_bopystatic_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangoshared_release|x64.ActiveCfg = py33_bopystatic_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangoshared_release|x64.Build.0 = py33_bopystatic_tangoshared_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangoshared_release|x64.ActiveCfg = py33_bopystatic_tangoshared_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangoshared_release|x64.Build.0 = py33_bopystatic_tangoshared_release|x64
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangostatic_release|Win32.ActiveCfg = py33_bopystatic_tangostatic_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangostatic_release|Win32.Build.0 = py33_bopystatic_tangostatic_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangostatic_release|x64.ActiveCfg = py33_bopystatic_tangostatic_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangostatic_release|x64.Build.0 = py33_bopystatic_tangostatic_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangostatic_release|x64.ActiveCfg = py33_bopystatic_tangostatic_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangostatic_release|x64.Build.0 = py33_bopystatic_tangostatic_release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/win/PyTango_VS9/PyTango.sln b/win/PyTango_VS9/PyTango.sln
index d4c1f67..c344d2b 100644
--- a/win/PyTango_VS9/PyTango.sln
+++ b/win/PyTango_VS9/PyTango.sln
@@ -39,64 +39,64 @@ Global
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopyshared_tangoshared_release|Win32.ActiveCfg = py26_bopyshared_tangoshared_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopyshared_tangoshared_release|Win32.Build.0 = py26_bopyshared_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopyshared_tangoshared_release|x64.ActiveCfg = py26_bopyshared_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopyshared_tangoshared_release|x64.Build.0 = py26_bopyshared_tangoshared_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopyshared_tangoshared_release|x64.ActiveCfg = py26_bopyshared_tangoshared_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopyshared_tangoshared_release|x64.Build.0 = py26_bopyshared_tangoshared_release|x64
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopystatic_tangoshared_release|Win32.ActiveCfg = py26_bopystatic_tangoshared_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopystatic_tangoshared_release|Win32.Build.0 = py26_bopystatic_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopystatic_tangoshared_release|x64.ActiveCfg = py26_bopystatic_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopystatic_tangoshared_release|x64.Build.0 = py26_bopystatic_tangoshared_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopystatic_tangoshared_release|x64.ActiveCfg = py26_bopystatic_tangoshared_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopystatic_tangoshared_release|x64.Build.0 = py26_bopystatic_tangoshared_release|x64
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopystatic_tangostatic_release|Win32.ActiveCfg = py26_bopystatic_tangostatic_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopystatic_tangostatic_release|Win32.Build.0 = py26_bopystatic_tangostatic_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopystatic_tangostatic_release|x64.ActiveCfg = py26_bopystatic_tangostatic_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopystatic_tangostatic_release|x64.Build.0 = py26_bopystatic_tangostatic_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopystatic_tangostatic_release|x64.ActiveCfg = py26_bopystatic_tangostatic_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py26_bopystatic_tangostatic_release|x64.Build.0 = py26_bopystatic_tangostatic_release|x64
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopyshared_tangoshared_release|Win32.ActiveCfg = py27_bopyshared_tangoshared_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopyshared_tangoshared_release|Win32.Build.0 = py27_bopyshared_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopyshared_tangoshared_release|x64.ActiveCfg = py27_bopyshared_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopyshared_tangoshared_release|x64.Build.0 = py27_bopyshared_tangoshared_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopyshared_tangoshared_release|x64.ActiveCfg = py27_bopyshared_tangoshared_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopyshared_tangoshared_release|x64.Build.0 = py27_bopyshared_tangoshared_release|x64
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopystatic_tangoshared_release|Win32.ActiveCfg = py27_bopystatic_tangoshared_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopystatic_tangoshared_release|Win32.Build.0 = py27_bopystatic_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopystatic_tangoshared_release|x64.ActiveCfg = py27_bopystatic_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopystatic_tangoshared_release|x64.Build.0 = py27_bopystatic_tangoshared_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopystatic_tangoshared_release|x64.ActiveCfg = py27_bopystatic_tangoshared_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopystatic_tangoshared_release|x64.Build.0 = py27_bopystatic_tangoshared_release|x64
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopystatic_tangostatic_release|Win32.ActiveCfg = py27_bopystatic_tangostatic_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopystatic_tangostatic_release|Win32.Build.0 = py27_bopystatic_tangostatic_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopystatic_tangostatic_release|x64.ActiveCfg = py27_bopystatic_tangostatic_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopystatic_tangostatic_release|x64.Build.0 = py27_bopystatic_tangostatic_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopystatic_tangostatic_release|x64.ActiveCfg = py27_bopystatic_tangostatic_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py27_bopystatic_tangostatic_release|x64.Build.0 = py27_bopystatic_tangostatic_release|x64
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopyshared_tangoshared_release|Win32.ActiveCfg = py31_bopyshared_tangoshared_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopyshared_tangoshared_release|Win32.Build.0 = py31_bopyshared_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopyshared_tangoshared_release|x64.ActiveCfg = py31_bopyshared_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopyshared_tangoshared_release|x64.Build.0 = py31_bopyshared_tangoshared_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopyshared_tangoshared_release|x64.ActiveCfg = py31_bopyshared_tangoshared_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopyshared_tangoshared_release|x64.Build.0 = py31_bopyshared_tangoshared_release|x64
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopystatic_tangoshared_release|Win32.ActiveCfg = py31_bopystatic_tangoshared_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopystatic_tangoshared_release|Win32.Build.0 = py31_bopystatic_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopystatic_tangoshared_release|x64.ActiveCfg = py31_bopystatic_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopystatic_tangoshared_release|x64.Build.0 = py31_bopystatic_tangoshared_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopystatic_tangoshared_release|x64.ActiveCfg = py31_bopystatic_tangoshared_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopystatic_tangoshared_release|x64.Build.0 = py31_bopystatic_tangoshared_release|x64
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopystatic_tangostatic_release|Win32.ActiveCfg = py31_bopystatic_tangostatic_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopystatic_tangostatic_release|Win32.Build.0 = py31_bopystatic_tangostatic_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopystatic_tangostatic_release|x64.ActiveCfg = py31_bopystatic_tangostatic_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopystatic_tangostatic_release|x64.Build.0 = py31_bopystatic_tangostatic_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopystatic_tangostatic_release|x64.ActiveCfg = py31_bopystatic_tangostatic_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py31_bopystatic_tangostatic_release|x64.Build.0 = py31_bopystatic_tangostatic_release|x64
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopyshared_tangoshared_release|Win32.ActiveCfg = py32_bopyshared_tangoshared_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopyshared_tangoshared_release|Win32.Build.0 = py32_bopyshared_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopyshared_tangoshared_release|x64.ActiveCfg = py32_bopyshared_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopyshared_tangoshared_release|x64.Build.0 = py32_bopyshared_tangoshared_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopyshared_tangoshared_release|x64.ActiveCfg = py32_bopyshared_tangoshared_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopyshared_tangoshared_release|x64.Build.0 = py32_bopyshared_tangoshared_release|x64
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopystatic_tangoshared_release|Win32.ActiveCfg = py32_bopystatic_tangoshared_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopystatic_tangoshared_release|Win32.Build.0 = py32_bopystatic_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopystatic_tangoshared_release|x64.ActiveCfg = py32_bopystatic_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopystatic_tangoshared_release|x64.Build.0 = py32_bopystatic_tangoshared_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopystatic_tangoshared_release|x64.ActiveCfg = py32_bopystatic_tangoshared_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopystatic_tangoshared_release|x64.Build.0 = py32_bopystatic_tangoshared_release|x64
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopystatic_tangostatic_release|Win32.ActiveCfg = py32_bopystatic_tangostatic_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopystatic_tangostatic_release|Win32.Build.0 = py32_bopystatic_tangostatic_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopystatic_tangostatic_release|x64.ActiveCfg = py32_bopystatic_tangostatic_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopystatic_tangostatic_release|x64.Build.0 = py32_bopystatic_tangostatic_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopystatic_tangostatic_release|x64.ActiveCfg = py32_bopystatic_tangostatic_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py32_bopystatic_tangostatic_release|x64.Build.0 = py32_bopystatic_tangostatic_release|x64
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopyshared_tangoshared_release|Win32.ActiveCfg = py33_bopyshared_tangoshared_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopyshared_tangoshared_release|Win32.Build.0 = py33_bopyshared_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopyshared_tangoshared_release|x64.ActiveCfg = py33_bopyshared_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopyshared_tangoshared_release|x64.Build.0 = py33_bopyshared_tangoshared_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopyshared_tangoshared_release|x64.ActiveCfg = py33_bopyshared_tangoshared_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopyshared_tangoshared_release|x64.Build.0 = py33_bopyshared_tangoshared_release|x64
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangoshared_release|Win32.ActiveCfg = py33_bopystatic_tangoshared_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangoshared_release|Win32.Build.0 = py33_bopystatic_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangoshared_release|x64.ActiveCfg = py33_bopystatic_tangoshared_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangoshared_release|x64.Build.0 = py33_bopystatic_tangoshared_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangoshared_release|x64.ActiveCfg = py33_bopystatic_tangoshared_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangoshared_release|x64.Build.0 = py33_bopystatic_tangoshared_release|x64
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangostatic_release|Win32.ActiveCfg = py33_bopystatic_tangostatic_release|Win32
{764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangostatic_release|Win32.Build.0 = py33_bopystatic_tangostatic_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangostatic_release|x64.ActiveCfg = py33_bopystatic_tangostatic_release|Win32
- {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangostatic_release|x64.Build.0 = py33_bopystatic_tangostatic_release|Win32
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangostatic_release|x64.ActiveCfg = py33_bopystatic_tangostatic_release|x64
+ {764A5ECE-11AE-4363-9A1C-573972A1BADD}.py33_bopystatic_tangostatic_release|x64.Build.0 = py33_bopystatic_tangostatic_release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/win/PyTango_VS9/PyTango.vcproj b/win/PyTango_VS9/PyTango.vcproj
index d3ebad3..7cde0e2 100644
--- a/win/PyTango_VS9/PyTango.vcproj
+++ b/win/PyTango_VS9/PyTango.vcproj
@@ -809,6 +809,7 @@
Name="VCLinkerTool"
AdditionalDependencies="$(PyTango27StaticLibs)"
AdditionalLibraryDirectories="$(Py27BoostStaticTangoStaticLibDir)"
+ IgnoreDefaultLibraryNames=""
LinkTimeCodeGeneration="1"
TargetMachine="17"
/>
diff --git a/win/PyTango_VS9/PyTango.vsprops b/win/PyTango_VS9/PyTango.vsprops
index ab4fed2..f4b1f69 100644
--- a/win/PyTango_VS9/PyTango.vsprops
+++ b/win/PyTango_VS9/PyTango.vsprops
@@ -93,10 +93,15 @@
<UserMacro Name="PyTangoBaseFile" Value="_PyTango" />
<UserMacro Name="TangoMajorVer" Value="8" />
- <UserMacro Name="TangoMinorVer" Value="0" />
- <UserMacro Name="TangoPatchVer" Value="5" />
+ <UserMacro Name="TangoMinorVer" Value="1" />
+ <UserMacro Name="TangoPatchVer" Value="2" />
<UserMacro Name="TangoVer" Value="$(TangoMajorVer).$(TangoMinorVer).$(TangoPatchVer)" />
+ <UserMacro Name="PyTangoMajorVer" Value="8" />
+ <UserMacro Name="PyTangoMinorVer" Value="1" />
+ <UserMacro Name="PyTangoPatchVer" Value="1" />
+ <UserMacro Name="PyTangoVer" Value="$(PyTangoMajorVer).$(PyTangoMinorVer).$(PyTangoPatchVer)" />
+
<UserMacro Name="BoostMajorVer" Value="1" />
<UserMacro Name="BoostMinorVer" Value="53" />
<UserMacro Name="BoostPatchVer" Value="0" />
@@ -126,7 +131,7 @@
<UserMacro Name="BaseDir" Value="$(ProjectDir)..\.." />
<UserMacro Name="RelPrefixDir" Value="$(ConfigurationName)_$(PlatformName)_msvc$(VCVer)" />
- <UserMacro Name="BaseBuildDir" Value="c:\temp\pytango\build" />
+ <UserMacro Name="BaseBuildDir" Value="c:\temp\pytango\build_$(PyTangoVer)_tg$(TangoVer)_boost$(BoostVer)" />
<UserMacro Name="BaseBuildLibDir" Value="$(BaseBuildDir)\lib" />
<UserMacro Name="BaseTempDir" Value="$(BaseBuildDir)\temp" />
<UserMacro Name="BaseDistDir" Value="$(BaseBuildDir)\dist" />
diff --git a/winsetup.py b/winsetup.py
index 941e7cb..30ac42f 100644
--- a/winsetup.py
+++ b/winsetup.py
@@ -1,34 +1,21 @@
#!/usr/bin/env python
+# ------------------------------------------------------------------------------
+# This file is part of PyTango (http://www.tinyurl.com/PyTango)
+#
+# Copyright 2006-2012 CELLS / ALBA Synchrotron, Bellaterra, Spain
+# Copyright 2013-2014 European Synchrotron Radiation Facility, Grenoble, France
+#
+# Distributed under the terms of the GNU Lesser General Public License,
+# either version 3 of the License, or (at your option) any later version.
+# See LICENSE.txt for more info.
+# ------------------------------------------------------------------------------
-################################################################################
-##
-## This file is part of PyTango, a python binding for Tango
-##
-## http://www.tango-controls.org/static/PyTango/latest/doc/html/index.html
-##
-## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
-##
-## PyTango is free software: you can redistribute it and/or modify
-## it under the terms of the GNU Lesser General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-##
-## PyTango is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public License
-## along with PyTango. If not, see <http://www.gnu.org/licenses/>.
-##
-################################################################################
-
-################################################################################
-# WARNING: This script should only be executed as a Post-Build Event from inside
-# Microsoft Visual Studio and not from the command line
-################################################################################
+# ------------------------------------------------------------------------------
+# WARNING: This script should only be executed as a Post-Build Event from inside
+# Microsoft Visual Studio and not from the command line
+# ------------------------------------------------------------------------------
-from __future__ import print_function
+from __future__ import print_function
import sys
import os
@@ -42,8 +29,8 @@ def main():
winsetup_dir = osp.dirname(osp.abspath(__file__))
os.chdir(winsetup_dir)
setup_name = "setup.py"
- bitmap = osp.join(winsetup_dir, 'doc', 'logo-medium.bmp')
- ver = ".".join(map(str, sys.version_info[:2]))
+ bitmap = osp.join(winsetup_dir, 'doc', 'logo-medium.bmp')
+ ver = ".".join(map(str, sys.version_info[:2]))
if len(sys.argv) < 6:
print("Need to supply build directory, distribution directory, temporary binary install directory, configuration name and platform name")
@@ -53,6 +40,8 @@ def main():
config_name, plat_name = sys.argv[4:6]
# temp_base_dir = osp.abspath(os.environ["TEMP"])
# temp_dir = osp.join(temp_base_dir, "PyTango", config_name)
+ if plat_name == 'x64':
+ plat_name = 'win-amd64'
try:
cmd_line = '%s %s ' % (executable, setup_name)
@@ -66,15 +55,13 @@ def main():
cmd_line += 'bdist_msi --skip-build --target-version=%s ' \
'--bdist-dir=%s ' \
'--dist-dir=%s ' \
- '--plat-name=%s ' \
- '--install-script=winpostinstall.py ' % (ver, bdist_dir, dist_dir, plat_name)
+ '--plat-name=%s ' % (ver, bdist_dir, dist_dir, plat_name)
cmd_line += 'bdist_wininst --skip-build --target-version=%s ' \
'--bdist-dir=%s ' \
'--dist-dir=%s ' \
'--title="PyTango 8" ' \
'--bitmap="%s" ' \
- '--plat-name=%s ' \
- '--install-script=winpostinstall.py ' % (ver, bdist_dir, dist_dir, bitmap, plat_name)
+ '--plat-name=%s ' % (ver, bdist_dir, dist_dir, bitmap, plat_name)
os.system(cmd_line)
except:
print("Failed:")
@@ -88,4 +75,4 @@ def main():
if __name__ == "__main__":
ret = main()
- sys.exit(ret)
\ No newline at end of file
+ sys.exit(ret)
--
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