runtime/PLCObject.py
author laurent
Thu, 08 Oct 2009 11:26:40 +0200
changeset 411 8261c8f1e365
parent 400 2c786431fe72
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.
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
     1
#!/usr/bin/env python
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
     2
# -*- coding: utf-8 -*-
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
     3
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
     4
#This file is part of Beremiz, a Integrated Development Environment for
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
     5
#programming IEC 61131-3 automates supporting plcopen standard and CanFestival. 
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
     6
#
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
     7
#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
     8
#
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
     9
#See COPYING file for copyrights details.
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    10
#
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    11
#This library is free software; you can redistribute it and/or
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    12
#modify it under the terms of the GNU General Public
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    13
#License as published by the Free Software Foundation; either
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    14
#version 2.1 of the License, or (at your option) any later version.
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    15
#
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    16
#This library is distributed in the hope that it will be useful,
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    17
#but WITHOUT ANY WARRANTY; without even the implied warranty of
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    18
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    19
#General Public License for more details.
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    20
#
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    21
#You should have received a copy of the GNU General Public
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    22
#License along with this library; if not, write to the Free Software
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    23
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    24
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    25
import Pyro.core as pyro
352
81777d4e379c fixed bug : Lock _FreePLC until _stopPLC finish
greg
parents: 350
diff changeset
    26
from threading import Timer, Thread, Lock
301
87c925eaaa3a Added support for wxglade GUIs.
etisserant
parents: 299
diff changeset
    27
import ctypes, os, commands, types, sys
87c925eaaa3a Added support for wxglade GUIs.
etisserant
parents: 299
diff changeset
    28
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    29
if os.name in ("nt", "ce"):
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    30
    from _ctypes import LoadLibrary as dlopen
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    31
    from _ctypes import FreeLibrary as dlclose
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    32
elif os.name == "posix":
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    33
    from _ctypes import dlopen, dlclose
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    34
344
25b7b7f854bc Wait the debug thread has terminated before freeing PLC to avoid random segmentation fault.
greg
parents: 339
diff changeset
    35
import traceback
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    36
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    37
lib_ext ={
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    38
     "linux2":".so",
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    39
     "win32":".dll",
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    40
     }.get(sys.platform, "")
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    41
291
701c0601db02 Added systematic stdout.flush runtime side, so that results appear in log window
etisserant
parents: 290
diff changeset
    42
def PLCprint(message):
701c0601db02 Added systematic stdout.flush runtime side, so that results appear in log window
etisserant
parents: 290
diff changeset
    43
    sys.stdout.write("PLCobject : "+message+"\n")
701c0601db02 Added systematic stdout.flush runtime side, so that results appear in log window
etisserant
parents: 290
diff changeset
    44
    sys.stdout.flush()
701c0601db02 Added systematic stdout.flush runtime side, so that results appear in log window
etisserant
parents: 290
diff changeset
    45
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    46
class PLCObject(pyro.ObjBase):
235
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
    47
    _Idxs = []
368
86ecd8374dae Adding support for twisted website HMI
laurent
parents: 366
diff changeset
    48
    def __init__(self, workingdir, daemon, argv, statuschange, evaluator, website):
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    49
        pyro.ObjBase.__init__(self)
301
87c925eaaa3a Added support for wxglade GUIs.
etisserant
parents: 299
diff changeset
    50
        self.evaluator = evaluator
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    51
        self.argv = [workingdir] + argv # force argv[0] to be "path" to exec...
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    52
        self.workingdir = workingdir
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    53
        self.PLCStatus = "Stopped"
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    54
        self.PLClibraryHandle = None
352
81777d4e379c fixed bug : Lock _FreePLC until _stopPLC finish
greg
parents: 350
diff changeset
    55
        self.PLClibraryLock = Lock()
366
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
    56
        self.DummyIteratorLock = None
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    57
        # Creates fake C funcs proxies
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    58
        self._FreePLC()
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    59
        self.daemon = daemon
269
d29c5f71574f add a TaskBarIcon to configure beremiz_service and display plc states (started, stopped)
greg
parents: 239
diff changeset
    60
        self.statuschange = statuschange
301
87c925eaaa3a Added support for wxglade GUIs.
etisserant
parents: 299
diff changeset
    61
        self.hmi_frame = None
368
86ecd8374dae Adding support for twisted website HMI
laurent
parents: 366
diff changeset
    62
        self.website = website
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    63
        
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    64
        # Get the last transfered PLC if connector must be restart
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    65
        try:
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    66
            self.CurrentPLCFilename=open(
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    67
                             self._GetMD5FileName(),
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    68
                             "r").read().strip() + lib_ext
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    69
        except Exception, e:
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    70
            self.PLCStatus = "Empty"
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    71
            self.CurrentPLCFilename=None
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    72
286
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
    73
    def StatusChange(self):
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
    74
        if self.statuschange is not None:
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
    75
            self.statuschange(self.PLCStatus)
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
    76
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    77
    def _GetMD5FileName(self):
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    78
        return os.path.join(self.workingdir, "lasttransferedPLC.md5")
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    79
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    80
    def _GetLibFileName(self):
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    81
        return os.path.join(self.workingdir,self.CurrentPLCFilename)
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    82
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    83
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    84
    def _LoadNewPLC(self):
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    85
        """
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    86
        Load PLC library
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    87
        Declare all functions, arguments and return values
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    88
        """
291
701c0601db02 Added systematic stdout.flush runtime side, so that results appear in log window
etisserant
parents: 290
diff changeset
    89
        PLCprint("Load PLC")
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    90
        try:
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    91
            self._PLClibraryHandle = dlopen(self._GetLibFileName())
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    92
            self.PLClibraryHandle = ctypes.CDLL(self.CurrentPLCFilename, handle=self._PLClibraryHandle)
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    93
    
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    94
            self._startPLC = self.PLClibraryHandle.startPLC
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    95
            self._startPLC.restype = ctypes.c_int
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    96
            self._startPLC.argtypes = [ctypes.c_int, ctypes.POINTER(ctypes.c_char_p)]
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
    97
            
366
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
    98
            self.DummyIteratorLock = Lock()
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
    99
            self.DummyIteratorLock.acquire()
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   100
            
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   101
            self._PythonIterator = getattr(self.PLClibraryHandle, "PythonIterator", None)
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   102
            if self._PythonIterator is not None:
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   103
                self._PythonIterator.restype = ctypes.c_char_p
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   104
                self._PythonIterator.argtypes = [ctypes.c_char_p]
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   105
                
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   106
                def StopPLCLock():
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   107
                    self.PLClibraryLock.acquire()
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   108
                    self.PLClibraryHandle.stopPLC()
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   109
                    self.PLClibraryLock.release()
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   110
                
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   111
            else:
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   112
                def DummyIterator(res):
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   113
                    self.DummyIteratorLock.acquire()
393
af20e07e53c5 Remove dirtylibs test while freeing plc libs in PLCObject.py
laurent
parents: 368
diff changeset
   114
                    self.DummyIteratorLock.release()
366
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   115
                    return None
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   116
                self._PythonIterator = DummyIterator
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   117
                
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   118
                def StopPLCLock():
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   119
                    self.PLClibraryLock.acquire()
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   120
                    self.PLClibraryHandle.stopPLC()
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   121
                    self.DummyIteratorLock.release()
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   122
                    self.PLClibraryLock.release()
352
81777d4e379c fixed bug : Lock _FreePLC until _stopPLC finish
greg
parents: 350
diff changeset
   123
            
81777d4e379c fixed bug : Lock _FreePLC until _stopPLC finish
greg
parents: 350
diff changeset
   124
            self._stopPLC = StopPLCLock
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   125
            self._stopPLC.restype = None
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   126
    
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   127
            self._ResetDebugVariables = self.PLClibraryHandle.ResetDebugVariables
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   128
            self._ResetDebugVariables.restype = None
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   129
    
235
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
   130
            self._RegisterDebugVariable = self.PLClibraryHandle.RegisterDebugVariable
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   131
            self._RegisterDebugVariable.restype = None
235
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
   132
            self._RegisterDebugVariable.argtypes = [ctypes.c_int]
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   133
    
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   134
            self._IterDebugData = self.PLClibraryHandle.IterDebugData
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   135
            self._IterDebugData.restype = ctypes.c_void_p
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   136
            self._IterDebugData.argtypes = [ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_char_p)]
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   137
    
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   138
            self._FreeDebugData = self.PLClibraryHandle.FreeDebugData
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   139
            self._FreeDebugData.restype = None
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   140
            
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   141
            self._WaitDebugData = self.PLClibraryHandle.WaitDebugData
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   142
            self._WaitDebugData.restype = ctypes.c_int  
235
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
   143
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
   144
            self._suspendDebug = self.PLClibraryHandle.suspendDebug
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
   145
            self._suspendDebug.restype = None
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
   146
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
   147
            self._resumeDebug = self.PLClibraryHandle.resumeDebug
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
   148
            self._resumeDebug.restype = None
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
   149
            
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   150
            return True
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   151
        except:
291
701c0601db02 Added systematic stdout.flush runtime side, so that results appear in log window
etisserant
parents: 290
diff changeset
   152
            PLCprint(traceback.format_exc())
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   153
            return False
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   154
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   155
    def _FreePLC(self):
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   156
        """
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   157
        Unload PLC library.
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   158
        This is also called by __init__ to create dummy C func proxies
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   159
        """
352
81777d4e379c fixed bug : Lock _FreePLC until _stopPLC finish
greg
parents: 350
diff changeset
   160
        self.PLClibraryLock.acquire()
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   161
        # Forget all refs to library
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   162
        self._startPLC = lambda:None
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   163
        self._stopPLC = lambda:None
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   164
        self._ResetDebugVariables = lambda:None
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   165
        self._RegisterDebugVariable = lambda x:None
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   166
        self._IterDebugData = lambda x,y:None
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   167
        self._FreeDebugData = lambda:None
235
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
   168
        self._WaitDebugData = lambda:-1
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
   169
        self._suspendDebug = lambda:None
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
   170
        self._resumeDebug = lambda:None
280
f2ef79f3dba0 Added native (not a plugin) asynchronous python eval function block - Beta. Code cleanup in C code templates.
etisserant
parents: 269
diff changeset
   171
        self._PythonIterator = lambda:""
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   172
        self.PLClibraryHandle = None
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   173
        # Unload library explicitely
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   174
        if getattr(self,"_PLClibraryHandle",None) is not None:
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   175
            dlclose(self._PLClibraryHandle)
393
af20e07e53c5 Remove dirtylibs test while freeing plc libs in PLCObject.py
laurent
parents: 368
diff changeset
   176
            self._PLClibraryHandle = None
af20e07e53c5 Remove dirtylibs test while freeing plc libs in PLCObject.py
laurent
parents: 368
diff changeset
   177
        
352
81777d4e379c fixed bug : Lock _FreePLC until _stopPLC finish
greg
parents: 350
diff changeset
   178
        self.PLClibraryLock.release()
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   179
        return False
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   180
299
d7f8ffe18017 Enhanced the way "runtime.py" is executed,
etisserant
parents: 291
diff changeset
   181
    def PrepareRuntimePy(self):
290
3bd617ae7a05 Local Runtime (LOCAL://) now launched "on demand"
etisserant
parents: 286
diff changeset
   182
        self.python_threads_vars = globals().copy()
344
25b7b7f854bc Wait the debug thread has terminated before freeing PLC to avoid random segmentation fault.
greg
parents: 339
diff changeset
   183
        self.python_threads_vars["WorkingDir"] = self.workingdir
368
86ecd8374dae Adding support for twisted website HMI
laurent
parents: 366
diff changeset
   184
        self.python_threads_vars["website"] = self.website
366
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   185
        self.python_threads_vars["_runtime_begin"] = []
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   186
        self.python_threads_vars["_runtime_cleanup"] = []
368
86ecd8374dae Adding support for twisted website HMI
laurent
parents: 366
diff changeset
   187
        
366
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   188
        for filename in os.listdir(self.workingdir):
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   189
            name, ext = os.path.splitext(filename)
391
9b1801ef99b5 fix runtime.py filename case to avoid problem on multi-platform
greg
parents: 368
diff changeset
   190
            if name.upper().startswith("RUNTIME") and ext.upper() == ".PY":
366
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   191
                try:
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   192
                    # TODO handle exceptions in runtime.py
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   193
                    # pyfile may redefine _runtime_cleanup
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   194
                    # or even call _PythonThreadProc itself.
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   195
                    execfile(os.path.join(self.workingdir, filename), self.python_threads_vars)
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   196
                except:
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   197
                    PLCprint(traceback.format_exc())
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   198
                runtime_begin = self.python_threads_vars.get("_%s_begin" % name, None)
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   199
                if runtime_begin is not None:
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   200
                    self.python_threads_vars["_runtime_begin"].append(runtime_begin)
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   201
                runtime_cleanup = self.python_threads_vars.get("_%s_cleanup" % name, None)
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   202
                if runtime_cleanup is not None:
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   203
                    self.python_threads_vars["_runtime_cleanup"].append(runtime_cleanup)
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   204
        
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   205
        for runtime_begin in self.python_threads_vars.get("_runtime_begin", []):
329
22e65b8e20f4 add autostart plc feature for beremiz_service
greg
parents: 327
diff changeset
   206
            runtime_begin()
368
86ecd8374dae Adding support for twisted website HMI
laurent
parents: 366
diff changeset
   207
            
86ecd8374dae Adding support for twisted website HMI
laurent
parents: 366
diff changeset
   208
        if self.website is not None:
86ecd8374dae Adding support for twisted website HMI
laurent
parents: 366
diff changeset
   209
            self.website.PLCStarted()
291
701c0601db02 Added systematic stdout.flush runtime side, so that results appear in log window
etisserant
parents: 290
diff changeset
   210
701c0601db02 Added systematic stdout.flush runtime side, so that results appear in log window
etisserant
parents: 290
diff changeset
   211
    def FinishRuntimePy(self):
366
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   212
        for runtime_cleanup in self.python_threads_vars.get("_runtime_cleanup", []):
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents: 365
diff changeset
   213
            runtime_cleanup()    
368
86ecd8374dae Adding support for twisted website HMI
laurent
parents: 366
diff changeset
   214
        if self.website is not None:
86ecd8374dae Adding support for twisted website HMI
laurent
parents: 366
diff changeset
   215
            self.website.PLCStopped()
291
701c0601db02 Added systematic stdout.flush runtime side, so that results appear in log window
etisserant
parents: 290
diff changeset
   216
        self.python_threads_vars = None
701c0601db02 Added systematic stdout.flush runtime side, so that results appear in log window
etisserant
parents: 290
diff changeset
   217
350
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   218
    def PythonThreadProc(self, debug):
291
701c0601db02 Added systematic stdout.flush runtime side, so that results appear in log window
etisserant
parents: 290
diff changeset
   219
        PLCprint("PythonThreadProc started")
350
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   220
        c_argv = ctypes.c_char_p * len(self.argv)
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   221
        error = None
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   222
        if self._LoadNewPLC():
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   223
            if self._startPLC(len(self.argv),c_argv(*self.argv)) == 0:
235
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
   224
                if debug:
327
e82c422ad811 Register the current watched variable in Debug Window before starting
lbessard
parents: 322
diff changeset
   225
                    for idx in self._Idxs:
e82c422ad811 Register the current watched variable in Debug Window before starting
lbessard
parents: 322
diff changeset
   226
                        self._RegisterDebugVariable(idx)
235
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
   227
                    self._resumeDebug()
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   228
                self.PLCStatus = "Started"
286
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   229
                self.StatusChange()
350
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   230
                self.evaluator(self.PrepareRuntimePy)
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   231
                res,cmd = "None","None"
352
81777d4e379c fixed bug : Lock _FreePLC until _stopPLC finish
greg
parents: 350
diff changeset
   232
                while True:
350
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   233
                    #print "_PythonIterator(", res, ")",
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   234
                    cmd = self._PythonIterator(res)
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   235
                    #print " -> ", cmd
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   236
                    if cmd is None:
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   237
                        break
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   238
                    try :
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   239
                        res = str(self.evaluator(eval,cmd,self.python_threads_vars))
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   240
                    except Exception,e:
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   241
                        res = "#EXCEPTION : "+str(e)
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   242
                        PLCprint(res)
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   243
                self.PLCStatus = "Stopped"
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   244
                self.StatusChange()
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   245
                self.evaluator(self.FinishRuntimePy)
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   246
            else:
350
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   247
                error = "starting"
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   248
        else:
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   249
            error = "loading"
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   250
        if error is not None:
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   251
            PLCprint("Problem %s PLC"%error)
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   252
            self.PLCStatus = "Broken"
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   253
        self._FreePLC()
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   254
        PLCprint("PythonThreadProc interrupted")
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   255
    
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   256
    def StartPLC(self, debug=False):
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   257
        PLCprint("StartPLC")
352
81777d4e379c fixed bug : Lock _FreePLC until _stopPLC finish
greg
parents: 350
diff changeset
   258
        if self.CurrentPLCFilename is not None:
411
8261c8f1e365 Bug on Debug trying to start (and stop) before PLC started fixed.
laurent
parents: 400
diff changeset
   259
            self.PLCStatus = "Starting"
350
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   260
            self.PythonThread = Thread(target=self.PythonThreadProc, args=[debug])
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   261
            self.PythonThread.start()
352
81777d4e379c fixed bug : Lock _FreePLC until _stopPLC finish
greg
parents: 350
diff changeset
   262
            
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   263
    def StopPLC(self):
350
a3a5561bde1d - now call load, start, free PLC from the python Thread
greg
parents: 344
diff changeset
   264
        PLCprint("StopPLC")
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   265
        if self.PLCStatus == "Started":
352
81777d4e379c fixed bug : Lock _FreePLC until _stopPLC finish
greg
parents: 350
diff changeset
   266
            self._stopPLC()
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   267
            return True
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   268
        return False
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   269
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   270
    def _Reload(self):
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   271
        self.daemon.shutdown(True)
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   272
        self.daemon.sock.close()
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   273
        os.execv(sys.executable,[sys.executable]+sys.argv[:])
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   274
        # never reached
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   275
        return 0
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   276
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   277
    def ForceReload(self):
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   278
        # respawn python interpreter
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   279
        Timer(0.1,self._Reload).start()
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   280
        return True
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   281
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   282
    def GetPLCstatus(self):
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   283
        return self.PLCStatus
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   284
    
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   285
    def NewPLC(self, md5sum, data, extrafiles):
291
701c0601db02 Added systematic stdout.flush runtime side, so that results appear in log window
etisserant
parents: 290
diff changeset
   286
        PLCprint("NewPLC (%s)"%md5sum)
393
af20e07e53c5 Remove dirtylibs test while freeing plc libs in PLCObject.py
laurent
parents: 368
diff changeset
   287
        if self.PLCStatus in ["Stopped", "Empty", "Broken"]:
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   288
            NewFileName = md5sum + lib_ext
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   289
            extra_files_log = os.path.join(self.workingdir,"extra_files.txt")
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   290
            try:
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   291
                os.remove(os.path.join(self.workingdir,
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   292
                                       self.CurrentPLCFilename))
364
27ea6a6747fc Bug extra_files deletion in working directory fixed
laurent
parents: 361
diff changeset
   293
                for filename in file(extra_files_log, "r").readlines() + [extra_files_log]:
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   294
                    try:
364
27ea6a6747fc Bug extra_files deletion in working directory fixed
laurent
parents: 361
diff changeset
   295
                        os.remove(os.path.join(self.workingdir, filename.strip()))
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   296
                    except:
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   297
                        pass
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   298
            except:
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   299
                pass
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   300
                        
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   301
            try:
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   302
                # Create new PLC file
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   303
                open(os.path.join(self.workingdir,NewFileName),
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   304
                     'wb').write(data)
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   305
        
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   306
                # Store new PLC filename based on md5 key
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   307
                open(self._GetMD5FileName(), "w").write(md5sum)
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   308
        
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   309
                # Then write the files
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   310
                log = file(extra_files_log, "w")
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   311
                for fname,fdata in extrafiles:
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   312
                    fpath = os.path.join(self.workingdir,fname)
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   313
                    open(fpath, "wb").write(fdata)
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   314
                    log.write(fname+'\n')
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   315
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   316
                # Store new PLC filename
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   317
                self.CurrentPLCFilename = NewFileName
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   318
            except:
291
701c0601db02 Added systematic stdout.flush runtime side, so that results appear in log window
etisserant
parents: 290
diff changeset
   319
                PLCprint(traceback.format_exc())
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   320
                return False
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   321
            if self.PLCStatus == "Empty":
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   322
                self.PLCStatus = "Stopped"
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   323
            return True
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   324
        return False
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   325
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   326
    def MatchMD5(self, MD5):
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   327
        try:
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   328
            last_md5 = open(self._GetMD5FileName(), "r").read()
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   329
            return last_md5 == MD5
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   330
        except:
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   331
            return False
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   332
    
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   333
    def SetTraceVariablesList(self, idxs):
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   334
        """
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   335
        Call ctype imported function to append 
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   336
        these indexes to registred variables in PLC debugger
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   337
        """
235
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
   338
        self._suspendDebug()
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   339
        # keep a copy of requested idx
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   340
        self._Idxs = idxs[:]
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   341
        self._ResetDebugVariables()
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   342
        for idx in idxs:
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   343
            self._RegisterDebugVariable(idx)
235
a66e150f2888 Improved debug data feedback.
etisserant
parents: 229
diff changeset
   344
        self._resumeDebug()
280
f2ef79f3dba0 Added native (not a plugin) asynchronous python eval function block - Beta. Code cleanup in C code templates.
etisserant
parents: 269
diff changeset
   345
f2ef79f3dba0 Added native (not a plugin) asynchronous python eval function block - Beta. Code cleanup in C code templates.
etisserant
parents: 269
diff changeset
   346
    class IEC_STRING(ctypes.Structure):
f2ef79f3dba0 Added native (not a plugin) asynchronous python eval function block - Beta. Code cleanup in C code templates.
etisserant
parents: 269
diff changeset
   347
        """
f2ef79f3dba0 Added native (not a plugin) asynchronous python eval function block - Beta. Code cleanup in C code templates.
etisserant
parents: 269
diff changeset
   348
        Must be changed according to changes in iec_types.h
f2ef79f3dba0 Added native (not a plugin) asynchronous python eval function block - Beta. Code cleanup in C code templates.
etisserant
parents: 269
diff changeset
   349
        """
f2ef79f3dba0 Added native (not a plugin) asynchronous python eval function block - Beta. Code cleanup in C code templates.
etisserant
parents: 269
diff changeset
   350
        _fields_ = [("len", ctypes.c_uint8),
302
d962b3d503b5 Enhanced wxGlade GUI creation.
etisserant
parents: 301
diff changeset
   351
                    ("body", ctypes.c_char * 127)] 
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   352
    
238
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   353
    TypeTranslator = {"BOOL" :       (ctypes.c_uint8, lambda x:x.value!=0),
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   354
                      "STEP" :       (ctypes.c_uint8, lambda x:x.value),
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   355
                      "TRANSITION" : (ctypes.c_uint8, lambda x:x.value),
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   356
                      "ACTION" :     (ctypes.c_uint8, lambda x:x.value),
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   357
                      "SINT" :       (ctypes.c_int8, lambda x:x.value),
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   358
                      "USINT" :      (ctypes.c_uint8, lambda x:x.value),
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   359
                      "BYTE" :       (ctypes.c_uint8, lambda x:x.value),
280
f2ef79f3dba0 Added native (not a plugin) asynchronous python eval function block - Beta. Code cleanup in C code templates.
etisserant
parents: 269
diff changeset
   360
                      "STRING" :     (IEC_STRING, lambda x:x.body[:x.len]),
238
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   361
                      "INT" :        (ctypes.c_int16, lambda x:x.value),
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   362
                      "UINT" :       (ctypes.c_uint16, lambda x:x.value),
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   363
                      "WORD" :       (ctypes.c_uint16, lambda x:x.value),
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   364
                      "WSTRING" :    (None, None),#TODO
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   365
                      "DINT" :       (ctypes.c_int32, lambda x:x.value),
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   366
                      "UDINT" :      (ctypes.c_uint32, lambda x:x.value),
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   367
                      "DWORD" :      (ctypes.c_uint32, lambda x:x.value),
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   368
                      "LINT" :       (ctypes.c_int64, lambda x:x.value),
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   369
                      "ULINT" :      (ctypes.c_uint64, lambda x:x.value),
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   370
                      "LWORD" :      (ctypes.c_uint64, lambda x:x.value),
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   371
                      "REAL" :       (ctypes.c_float, lambda x:x.value),
02d0daed3e46 Debugger now reports BOOL as booleans
etisserant
parents: 237
diff changeset
   372
                      "LREAL" :      (ctypes.c_double, lambda x:x.value),
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   373
                      } 
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   374
                           
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   375
    def GetTraceVariables(self):
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   376
        """
339
6dbde4a0c31d Adding support for updating PLC status when stopping
greg
parents: 336
diff changeset
   377
        Return a list of variables, corresponding to the list of required idx
229
8bc65076e290 add tests for win32
greg
parents: 227
diff changeset
   378
        """
286
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   379
        if self.PLCStatus == "Started":
353
c68fc75ebb06 Adding Lock around C code called by Debug thread
greg
parents: 352
diff changeset
   380
            self.PLClibraryLock.acquire()
286
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   381
            tick = self._WaitDebugData()
353
c68fc75ebb06 Adding Lock around C code called by Debug thread
greg
parents: 352
diff changeset
   382
            #PLCprint("Debug tick : %d"%tick)
400
2c786431fe72 Bug on return debug tick test fixed
laurent
parents: 398
diff changeset
   383
            if tick == 2**32 - 1:
2c786431fe72 Bug on return debug tick test fixed
laurent
parents: 398
diff changeset
   384
                tick = -1
286
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   385
                res = None
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   386
            else:
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   387
                idx = ctypes.c_int()
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   388
                typename = ctypes.c_char_p()
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   389
                res = []
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   390
        
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   391
                for given_idx in self._Idxs:
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   392
                    buffer=self._IterDebugData(ctypes.byref(idx), ctypes.byref(typename))
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   393
                    c_type,unpack_func = self.TypeTranslator.get(typename.value, (None,None))
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   394
                    if c_type is not None and given_idx == idx.value:
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   395
                        res.append(unpack_func(ctypes.cast(buffer,
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   396
                                                           ctypes.POINTER(c_type)).contents))
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   397
                    else:
291
701c0601db02 Added systematic stdout.flush runtime side, so that results appear in log window
etisserant
parents: 290
diff changeset
   398
                        PLCprint("Debug error idx : %d, expected_idx %d, type : %s"%(idx.value, given_idx,typename.value))
286
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   399
                        res.append(None)
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   400
            self._FreeDebugData()
353
c68fc75ebb06 Adding Lock around C code called by Debug thread
greg
parents: 352
diff changeset
   401
            self.PLClibraryLock.release()
286
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   402
            return tick, res
a2a8a52b0d4f Minor changes to get better cleanup of debug and python_eval threads, accross multiple debug sessions and PLC runs.
etisserant
parents: 283
diff changeset
   403
        return -1, None
353
c68fc75ebb06 Adding Lock around C code called by Debug thread
greg
parents: 352
diff changeset
   404