connectors/PYRO/__init__.py
author laurent
Thu, 08 Oct 2009 11:26:40 +0200
changeset 411 8261c8f1e365
parent 399 77e23bf04c33
child 446 1edde533db19
permissions -rwxr-xr-x
Bug on Debug trying to start (and stop) before PLC started fixed.
Adding support for detecting platform default settings for target type and canfestival node.
Clear tests folder, leaving only multi-platform tests.
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
     1
#!/usr/bin/env python
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
     2
# -*- coding: utf-8 -*-
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
     3
#
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
     4
#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
     5
#
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
     6
#See COPYING file for copyrights details.
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
     7
#
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
     8
#This library is free software; you can redistribute it and/or
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
     9
#modify it under the terms of the GNU General Public
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    10
#License as published by the Free Software Foundation; either
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    11
#version 2.1 of the License, or (at your option) any later version.
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    12
#
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    13
#This library is distributed in the hope that it will be useful,
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    14
#but WITHOUT ANY WARRANTY; without even the implied warranty of
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    15
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    16
#General Public License for more details.
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    17
#
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    18
#You should have received a copy of the GNU General Public
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    19
#License along with this library; if not, write to the Free Software
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    20
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    21
import Pyro.core as pyro
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    22
from Pyro.errors import PyroError
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    23
import traceback
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    24
from time import sleep
231
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
    25
import copy
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    26
399
77e23bf04c33 Merging some improvements from BCT
laurent
parents: 361
diff changeset
    27
# this module attribute contains a list of DNS-SD (Zeroconf) service types
77e23bf04c33 Merging some improvements from BCT
laurent
parents: 361
diff changeset
    28
# supported by this connector plugin.
77e23bf04c33 Merging some improvements from BCT
laurent
parents: 361
diff changeset
    29
#
77e23bf04c33 Merging some improvements from BCT
laurent
parents: 361
diff changeset
    30
# for connectors that do not support DNS-SD, this attribute can be omitted
77e23bf04c33 Merging some improvements from BCT
laurent
parents: 361
diff changeset
    31
# or set to an empty list.
77e23bf04c33 Merging some improvements from BCT
laurent
parents: 361
diff changeset
    32
supported_dnssd_services = ["_PYRO._tcp.local."]
77e23bf04c33 Merging some improvements from BCT
laurent
parents: 361
diff changeset
    33
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    34
def PYRO_connector_factory(uri, pluginsroot):
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    35
    """
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    36
    This returns the connector to Pyro style PLCobject
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    37
    """
361
331d698e1118 Adding support for internationalization
laurent
parents: 354
diff changeset
    38
    pluginsroot.logger.write(_("Connecting to URI : %s\n")%uri)
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    39
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    40
    servicetype, location = uri.split("://")
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    41
    
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    42
    # Try to get the proxy object
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    43
    try :
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    44
        RemotePLCObjectProxy = pyro.getAttrProxyForURI("PYROLOC://"+location+"/PLCObject")
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    45
    except Exception, msg:
361
331d698e1118 Adding support for internationalization
laurent
parents: 354
diff changeset
    46
        pluginsroot.logger.write_error(_("Wrong URI, please check it !\n"))
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    47
        pluginsroot.logger.write_error(traceback.format_exc())
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    48
        return None
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    49
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    50
    def PyroCatcher(func, default=None):
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    51
        """
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    52
        A function that catch a pyro exceptions, write error to logger
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    53
        and return defaul value when it happen
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    54
        """
218
71fddab24be9 remove old code and fix typo
greg
parents: 203
diff changeset
    55
        def catcher_func(*args,**kwargs):
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    56
            try:
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    57
                return func(*args,**kwargs)
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    58
            except PyroError,e:
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    59
                #pluginsroot.logger.write_error(traceback.format_exc())
349
24d4e48714ed add "\n" to logger when pyro fall in error
greg
parents: 284
diff changeset
    60
                pluginsroot.logger.write_error(str(e)+"\n")
354
ff721067a75c Fix refresh of Beremiz button when connection lost
greg
parents: 349
diff changeset
    61
                pluginsroot._connector = None
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    62
                return default
218
71fddab24be9 remove old code and fix typo
greg
parents: 203
diff changeset
    63
        return catcher_func
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    64
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    65
    # Check connection is effective. 
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    66
    # lambda is for getattr of GetPLCstatus to happen inside catcher
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    67
    if PyroCatcher(lambda:RemotePLCObjectProxy.GetPLCstatus())() == None:
361
331d698e1118 Adding support for internationalization
laurent
parents: 354
diff changeset
    68
        pluginsroot.logger.write_error(_("Cannot get PLC status - connection failed.\n"))
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    69
        return None
231
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
    70
284
3fecc96090c8 Fixed problem with re-use of Pyro connector proxy copy across debug sessions
etisserant
parents: 235
diff changeset
    71
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    72
    class PyroProxyProxy:
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    73
        """
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    74
        A proxy proxy class to handle Beremiz Pyro interface specific behavior.
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    75
        And to put pyro exception catcher in between caller and pyro proxy
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    76
        """
284
3fecc96090c8 Fixed problem with re-use of Pyro connector proxy copy across debug sessions
etisserant
parents: 235
diff changeset
    77
        def __init__(self):
3fecc96090c8 Fixed problem with re-use of Pyro connector proxy copy across debug sessions
etisserant
parents: 235
diff changeset
    78
            # for safe use in from debug thread, must create a copy
3fecc96090c8 Fixed problem with re-use of Pyro connector proxy copy across debug sessions
etisserant
parents: 235
diff changeset
    79
            self.RemotePLCObjectProxyCopy = None
3fecc96090c8 Fixed problem with re-use of Pyro connector proxy copy across debug sessions
etisserant
parents: 235
diff changeset
    80
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    81
        def GetPyroProxy(self):
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    82
            """
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    83
            This func returns the real Pyro Proxy.
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    84
            Use this if you musn't keep reference to it.
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    85
            """
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    86
            return RemotePLCObjectProxy
231
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
    87
235
a66e150f2888 Improved debug data feedback.
etisserant
parents: 231
diff changeset
    88
        def _PyroStartPLC(self, *args, **kwargs):
231
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
    89
            """
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
    90
            pluginsroot._connector.GetPyroProxy() is used 
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
    91
            rather than RemotePLCObjectProxy because
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
    92
            object is recreated meanwhile, 
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
    93
            so we must not keep ref to it here
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
    94
            """
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
    95
            if pluginsroot._connector.GetPyroProxy().GetPLCstatus() == "Dirty":
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
    96
                """
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
    97
                Some bad libs with static symbols may polute PLC
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
    98
                ask runtime to suicide and come back again
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
    99
                """
361
331d698e1118 Adding support for internationalization
laurent
parents: 354
diff changeset
   100
                pluginsroot.logger.write(_("Force runtime reload\n"))
231
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   101
                pluginsroot._connector.GetPyroProxy().ForceReload()
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   102
                pluginsroot._Disconnect()
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   103
                # let remote PLC time to resurect.(freeze app)
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   104
                sleep(0.5)
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   105
                pluginsroot._Connect()
284
3fecc96090c8 Fixed problem with re-use of Pyro connector proxy copy across debug sessions
etisserant
parents: 235
diff changeset
   106
            self.RemotePLCObjectProxyCopy = copy.copy(pluginsroot._connector.GetPyroProxy())
235
a66e150f2888 Improved debug data feedback.
etisserant
parents: 231
diff changeset
   107
            return pluginsroot._connector.GetPyroProxy().StartPLC(*args, **kwargs)
231
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   108
        StartPLC = PyroCatcher(_PyroStartPLC, False)
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   109
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   110
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   111
        def _PyroGetTraceVariables(self):
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   112
            """
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   113
            for safe use in from debug thread, must use the copy
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   114
            """
284
3fecc96090c8 Fixed problem with re-use of Pyro connector proxy copy across debug sessions
etisserant
parents: 235
diff changeset
   115
            if self.RemotePLCObjectProxyCopy is not None and self.RemotePLCObjectProxyCopy.GetPLCstatus() == "Started":
3fecc96090c8 Fixed problem with re-use of Pyro connector proxy copy across debug sessions
etisserant
parents: 235
diff changeset
   116
                return self.RemotePLCObjectProxyCopy.GetTraceVariables()
235
a66e150f2888 Improved debug data feedback.
etisserant
parents: 231
diff changeset
   117
            else:
a66e150f2888 Improved debug data feedback.
etisserant
parents: 231
diff changeset
   118
                return None,None
284
3fecc96090c8 Fixed problem with re-use of Pyro connector proxy copy across debug sessions
etisserant
parents: 235
diff changeset
   119
        GetTraceVariables = PyroCatcher(_PyroGetTraceVariables,(None,None))
231
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   120
411
8261c8f1e365 Bug on Debug trying to start (and stop) before PLC started fixed.
laurent
parents: 399
diff changeset
   121
        def _PyroPLCIsStarting(self):
8261c8f1e365 Bug on Debug trying to start (and stop) before PLC started fixed.
laurent
parents: 399
diff changeset
   122
            """
8261c8f1e365 Bug on Debug trying to start (and stop) before PLC started fixed.
laurent
parents: 399
diff changeset
   123
            for safe use in from debug thread, must use the copy
8261c8f1e365 Bug on Debug trying to start (and stop) before PLC started fixed.
laurent
parents: 399
diff changeset
   124
            """
8261c8f1e365 Bug on Debug trying to start (and stop) before PLC started fixed.
laurent
parents: 399
diff changeset
   125
            return self.RemotePLCObjectProxyCopy is not None and self.RemotePLCObjectProxyCopy.GetPLCstatus() == "Starting"
8261c8f1e365 Bug on Debug trying to start (and stop) before PLC started fixed.
laurent
parents: 399
diff changeset
   126
        PLCIsStarting = PyroCatcher(_PyroPLCIsStarting,False)
8261c8f1e365 Bug on Debug trying to start (and stop) before PLC started fixed.
laurent
parents: 399
diff changeset
   127
        
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   128
        def __getattr__(self, attrName):
231
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   129
            member = self.__dict__.get(attrName, None)
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   130
            if member is None:
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   131
                def my_local_func(*args,**kwargs):
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   132
                    return RemotePLCObjectProxy.__getattr__(attrName)(*args,**kwargs)
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   133
                member = PyroCatcher(my_local_func, None)
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   134
                self.__dict__[attrName] = member
231
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   135
            return member
f1db3ce8f40a Re-organized pyro connector proxy members mascarading
etisserant
parents: 218
diff changeset
   136
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   137
    return PyroProxyProxy()
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   138
    
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   139