Source code for sardana.pool.pooldefs

#!/usr/bin/env python

##############################################################################
##
# This file is part of Sardana
##
# http://www.sardana-controls.org/
##
# Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
##
# Sardana 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.
##
# Sardana 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 Sardana.  If not, see <http://www.gnu.org/licenses/>.
##
##############################################################################

"""This file contains the basic pool definitions."""

__all__ = ["ControllerAPI", "AcqTriggerType", "AcqMode", "SynchDomain",
           "SynchParam", "AcqSynch", "AcqSynchType"]

__docformat__ = 'restructuredtext'

from operator import __getitem__
from enum import IntEnum
from taurus.core.util.enumeration import Enumeration
from sardana.taurus.core.tango.sardana import AcqTriggerType, AcqMode

#: A constant defining the controller API version currently supported
ControllerAPI = 1.1

# synchronization domain: Time means that the configuration parameter will be
# expressed in the time domain, Position means the motor position domain and
# Monitor means the count to monitor domain


class SynchEnum(IntEnum):

    @classmethod
    def fromStr(cls, string):
        '''Convert string representation of SynchDomain enum e.g.
        'SynchDomain.Time' to SynchDomain objects. It also works with just
        domain strings like 'Time'. The following expressions are True:

        SynchDomain.fromStr(str(SynchDomain.Time)) == SynchDomain.Time
        SynchDomain.fromStr('Time') == SynchDomain.Time
        '''
        domain = string.split('.')
        if len(domain) == 1:
            return __getitem__(cls, domain[0])
        elif len(domain) == 2:
            return __getitem__(cls, domain[1])
        else:
            raise ValueError('Can not convert %s to SynchDomain' % string)


[docs]class SynchDomain(SynchEnum): """Enumeration of synchronization domains. - Time - describes the synchronization in time domain - Position - describes the synchronization in position domain - Monitor - not used at the moment but foreseen for synchronization on monitor .. note:: The SynchDomain class has been included in Sardana on a provisional basis. Backwards incompatible changes (up to and including removal of the class) may occur if deemed necessary by the core developers. """ Time = 0 Position = 1 Monitor = 2
# - Default - the controller selects the most appropriate domain: # for active events the precedence should be first Position and then # Time # for passive events the precedence should be first Time and then # Position # Default = 3
[docs]class SynchParam(SynchEnum): """Enumeration of synchronization description group parameters. - Delay - initial delay (relative to the synchronization start) - Total - total interval - Active - active interval (part of the total interval) - Repeats - number of repetitions within the group - Initial - initial point (absolute) .. note:: The SynchParam class has been included in Sardana on a provisional basis. Backwards incompatible changes (up to and including removal of the class) may occur if deemed necessary by the core developers. """ Delay = 0 Total = 1 Active = 2 Repeats = 3 Initial = 4
AcqSynchType = Enumeration("AcqSynchType", ["Trigger", "Gate", "Start"]) AcqSynchType.__doc__ = \ """Enumeration of synchronization types. Options: - Trigger - Start each acquisition (experimental channel will decide on itself when to end, based on integration time / monitor count) - Gate - Start and end each acquisition - Start - Start only the first acquisition (experimental channel will drive the acquisition based on integration time / monitor count, latency time and number of repetitions) .. todo:: convert to python enums, but having in mind problems with JSON serialization: https://bugs.python.org/issue18264 """
[docs]class AcqSynch(IntEnum): """Enumeration of synchronization options. Uses software/hardware naming to refer to internal (software synchronizer) or external (hardware synchronization device) synchronization modes. See :obj:`~sardana.pool.pooldefs.AcqSynchType` to get more details about the synchronization type e.g. trigger, gate or start. """ SoftwareTrigger = 0 """Internal (software) trigger .. image:: /_static/acqsynch_softtrig.png """ HardwareTrigger = 1 """External (hardware) trigger .. image:: /_static/acqsynch_hardtrig.png """ SoftwareGate = 2 """Internal (software) gate - not implemented """ HardwareGate = 3 """External (hardware) gate .. image:: /_static/acqsynch_hardgate.png """ SoftwareStart = 4 """ Internal (software) start (triggers just the first acquisition) .. image:: /_static/acqsynch_softstart.png """ HardwareStart = 5 """External (hardware) start (triggers just the first acquisition) .. image:: /_static/acqsynch_hardstart.png """
[docs] @classmethod def from_synch_type(self, software, synch_type): """Helper obtain AcqSynch from information about software/hardware nature of synchronization element and AcqSynchType """ if synch_type is AcqSynchType.Trigger: if software: return AcqSynch.SoftwareTrigger else: return AcqSynch.HardwareTrigger elif synch_type is AcqSynchType.Gate: if software: return AcqSynch.SoftwareGate else: return AcqSynch.HardwareGate elif synch_type is AcqSynchType.Start: if software: return AcqSynch.SoftwareStart else: return AcqSynch.HardwareStart else: raise ValueError("Unable to determine AcqSynch from %s" % synch_type)