targets/typemapping.py
author Andrey Skvortsov <andrej.skvortzov@gmail.com>
Thu, 28 Apr 2016 13:05:57 +0300
changeset 1507 d7f474d10210
parent 1433 4a45f6642523
child 1571 486f94a8032c
permissions -rw-r--r--
fix issue with sometimes wrong return code of ProcessLogger


As a result of wrong return code Beremiz gives folowing traceback:
Traceback (most recent call last):
File "./Beremiz.py", line 850, in OnMenu
getattr(self.CTR, method)()
File "/home/developer/WorkData/PLC/beremiz/beremiz/ProjectController.py", line 925, in _Build
IECGenRes = self._Generate_SoftPLC()
File "/home/developer/WorkData/PLC/beremiz/beremiz/ProjectController.py", line 568, in _Generate_SoftPLC
return self._Compile_ST_to_SoftPLC()
File "/home/developer/WorkData/PLC/beremiz/beremiz/ProjectController.py", line 661, in _Compile_ST_to_SoftPLC
C_files.remove("POUS.c")
ValueError: list.remove(x): x not in list

The problem is that both threads (for reading stdout and stderr) call self.Proc.poll(),
that updates internal returncode field. This call is done without any locking and the first thread gets correct result,
but other gets 0 as retval. If 0 gets thread, that afterwards calls callback finish, then wrong return code is returned
to the parent. Now only the thread with a callback polls for the return code, other thread just checked local value.

Additionally function spin() waits now until all threads finish reading their pipes, so the results are always correct.
592
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
     1
#!/usr/bin/env python
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
     2
# -*- coding: utf-8 -*-
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
     3
#
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
     4
#Copyright (C) 2011: Edouard TISSERANT and Laurent BESSARD
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
     5
#
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
     6
#See COPYING file for copyrights details.
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
     7
#
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
     8
#This library is free software; you can redistribute it and/or
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
     9
#modify it under the terms of the GNU General Public
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    10
#License as published by the Free Software Foundation; either
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    11
#version 2.1 of the License, or (at your option) any later version.
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    12
#
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    13
#This library is distributed in the hope that it will be useful,
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    14
#but WITHOUT ANY WARRANTY; without even the implied warranty of
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    15
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    16
#General Public License for more details.
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    17
#
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    18
#You should have received a copy of the GNU General Public
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    19
#License along with this library; if not, write to the Free Software
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    20
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    21
1433
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    22
import ctypes
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    23
ctypes.pythonapi.PyString_AsString.argtypes = (ctypes.c_void_p,)
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    24
ctypes.pythonapi.PyString_AsString.restype = ctypes.POINTER(ctypes.c_char)
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    25
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    26
592
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    27
from ctypes import *
593
726f58cf97e3 fixed typo in latest debugger changes
edouard
parents: 592
diff changeset
    28
from datetime import timedelta as td
592
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    29
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    30
class IEC_STRING(Structure):
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    31
    """
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    32
    Must be changed according to changes in iec_types.h
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    33
    """
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    34
    _fields_ = [("len", c_uint8),
1433
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    35
                ("body", c_char * 126)]
592
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    36
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    37
class IEC_TIME(Structure):
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    38
    """
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    39
    Must be changed according to changes in iec_types.h
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    40
    """
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    41
    _fields_ = [("s", c_long), #tv_sec
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    42
                ("ns", c_long)] #tv_nsec
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    43
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    44
def _t(t, u=lambda x:x.value, p=lambda t,x:t(x)): return  (t, u, p)
1433
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    45
def _ttime(): return (IEC_TIME,
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    46
                      lambda x:td(0, x.s, x.ns/1000),
595
6348c0110e0f Added support for handling ANY_DATE types in debugger type translation
Edouard Tisserant
parents: 594
diff changeset
    47
                      lambda t,x:t(x.days * 24 * 3600 + x.seconds, x.microseconds*1000))
592
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    48
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    49
SameEndianessTypeTranslator = {
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    50
    "BOOL" :       _t(c_uint8,  lambda x:x.value!=0),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    51
    "STEP" :       _t(c_uint8),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    52
    "TRANSITION" : _t(c_uint8),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    53
    "ACTION" :     _t(c_uint8),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    54
    "SINT" :       _t(c_int8),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    55
    "USINT" :      _t(c_uint8),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    56
    "BYTE" :       _t(c_uint8),
1433
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    57
    "STRING" :     (IEC_STRING,
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    58
                      lambda x:x.body[:x.len],
592
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    59
                      lambda t,x:t(len(x),x)),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    60
    "INT" :        _t(c_int16),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    61
    "UINT" :       _t(c_uint16),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    62
    "WORD" :       _t(c_uint16),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    63
    "DINT" :       _t(c_int32),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    64
    "UDINT" :      _t(c_uint32),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    65
    "DWORD" :      _t(c_uint32),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    66
    "LINT" :       _t(c_int64),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    67
    "ULINT" :      _t(c_uint64),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    68
    "LWORD" :      _t(c_uint64),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    69
    "REAL" :       _t(c_float),
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    70
    "LREAL" :      _t(c_double),
595
6348c0110e0f Added support for handling ANY_DATE types in debugger type translation
Edouard Tisserant
parents: 594
diff changeset
    71
    "TIME" :       _ttime(),
6348c0110e0f Added support for handling ANY_DATE types in debugger type translation
Edouard Tisserant
parents: 594
diff changeset
    72
    "TOD" :        _ttime(),
6348c0110e0f Added support for handling ANY_DATE types in debugger type translation
Edouard Tisserant
parents: 594
diff changeset
    73
    "DATE" :       _ttime(),
6348c0110e0f Added support for handling ANY_DATE types in debugger type translation
Edouard Tisserant
parents: 594
diff changeset
    74
    "DT" :         _ttime(),
1433
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    75
    }
592
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    76
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    77
SwapedEndianessTypeTranslator = {
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    78
    #TODO
1433
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    79
    }
592
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    80
1075
8078c01ae464 Now Debug Buffer Unpacking is a separate function, declared in typemapping.py
Edouard Tisserant
parents: 972
diff changeset
    81
TypeTranslator=SameEndianessTypeTranslator
8078c01ae464 Now Debug Buffer Unpacking is a separate function, declared in typemapping.py
Edouard Tisserant
parents: 972
diff changeset
    82
592
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    83
# Construct debugger natively supported types
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    84
DebugTypesSize =  dict([(key,sizeof(t)) for key,(t,p,u) in SameEndianessTypeTranslator.iteritems() if t is not None])
c6408f92da0a Initial TIME support in debugger
Edouard Tisserant
parents:
diff changeset
    85
1433
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    86
def UnpackDebugBuffer(buff, indexes):
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    87
    res =  []
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    88
    buffoffset = 0
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    89
    buffsize = len(buff)
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    90
    buffptr = cast(ctypes.pythonapi.PyString_AsString(id(buff)),c_void_p).value
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    91
    for iectype in indexes:
1075
8078c01ae464 Now Debug Buffer Unpacking is a separate function, declared in typemapping.py
Edouard Tisserant
parents: 972
diff changeset
    92
        c_type,unpack_func, pack_func = \
8078c01ae464 Now Debug Buffer Unpacking is a separate function, declared in typemapping.py
Edouard Tisserant
parents: 972
diff changeset
    93
            TypeTranslator.get(iectype,
8078c01ae464 Now Debug Buffer Unpacking is a separate function, declared in typemapping.py
Edouard Tisserant
parents: 972
diff changeset
    94
                                    (None,None,None))
1433
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    95
        if c_type is not None and buffoffset < buffsize:
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    96
            cursor = c_void_p( buffptr + buffoffset)
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    97
            value = unpack_func( cast(cursor,
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    98
                         POINTER(c_type)).contents)
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
    99
            buffoffset += sizeof(c_type) if iectype != "STRING" else len(value)+1
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
   100
            res.append(value)
1075
8078c01ae464 Now Debug Buffer Unpacking is a separate function, declared in typemapping.py
Edouard Tisserant
parents: 972
diff changeset
   101
        else:
8078c01ae464 Now Debug Buffer Unpacking is a separate function, declared in typemapping.py
Edouard Tisserant
parents: 972
diff changeset
   102
            break
1433
4a45f6642523 Moved trace buffer unpacking in the IDE. Latest traced variable samples are now passed as a single string
Edouard Tisserant
parents: 1075
diff changeset
   103
    if buffoffset and buffoffset == buffsize:
1075
8078c01ae464 Now Debug Buffer Unpacking is a separate function, declared in typemapping.py
Edouard Tisserant
parents: 972
diff changeset
   104
        return res
8078c01ae464 Now Debug Buffer Unpacking is a separate function, declared in typemapping.py
Edouard Tisserant
parents: 972
diff changeset
   105
    return None
8078c01ae464 Now Debug Buffer Unpacking is a separate function, declared in typemapping.py
Edouard Tisserant
parents: 972
diff changeset
   106
8078c01ae464 Now Debug Buffer Unpacking is a separate function, declared in typemapping.py
Edouard Tisserant
parents: 972
diff changeset
   107
8078c01ae464 Now Debug Buffer Unpacking is a separate function, declared in typemapping.py
Edouard Tisserant
parents: 972
diff changeset
   108
917
401e44bae7c0 Now logging have 4 levels
Edouard Tisserant
parents: 595
diff changeset
   109
LogLevels = ["CRITICAL","WARNING","INFO","DEBUG"]
401e44bae7c0 Now logging have 4 levels
Edouard Tisserant
parents: 595
diff changeset
   110
LogLevelsCount = len(LogLevels)
401e44bae7c0 Now logging have 4 levels
Edouard Tisserant
parents: 595
diff changeset
   111
LogLevelsDict = dict(zip(LogLevels,range(LogLevelsCount)))
401e44bae7c0 Now logging have 4 levels
Edouard Tisserant
parents: 595
diff changeset
   112
LogLevelsDefault = LogLevelsDict["DEBUG"]
972
659198075ce4 Redirect PyEval exceptions to logging
Edouard Tisserant
parents: 917
diff changeset
   113