# This file is part of Beremiz, runtime and an Integrated Development Environment for
# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
# Copyright (C) 2011: Edouard TISSERANT and Laurent BESSARD
# See COPYING.Runtime file for copyrights details.
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
from datetime import timedelta as td
ctypes.pythonapi.PyString_AsString.argtypes = (ctypes.c_void_p,)
ctypes.pythonapi.PyString_AsString.restype = ctypes.POINTER(ctypes.c_char)
class IEC_STRING(Structure):
Must be changed according to changes in iec_types.h
_fields_ = [("len", c_uint8),
class IEC_TIME(Structure):
Must be changed according to changes in iec_types.h
_fields_ = [("s", c_long), # tv_sec
("ns", c_long)] # tv_nsec
def _t(t, u=lambda x: x.value, p=lambda t, x: t(x)):
lambda x: td(0, x.s, x.ns/1000),
lambda t, x: t(x.days * 24 * 3600 + x.seconds, x.microseconds*1000))
SameEndianessTypeTranslator = {
"BOOL": _t(c_uint8, lambda x: x.value != 0),
"TRANSITION": _t(c_uint8),
lambda x: x.body[:x.len],
lambda t, x: t(len(x), x)),
SwapedEndianessTypeTranslator = {
TypeTranslator = SameEndianessTypeTranslator
# Construct debugger natively supported types
DebugTypesSize = dict([(key, sizeof(t)) for key, (t, p, u) in SameEndianessTypeTranslator.iteritems() if t is not None])
def UnpackDebugBuffer(buff, indexes):
buffptr = cast(ctypes.pythonapi.PyString_AsString(id(buff)), c_void_p).value
c_type, unpack_func, pack_func = \
TypeTranslator.get(iectype, (None, None, None))
if c_type is not None and buffoffset < buffsize:
cursor = c_void_p(buffptr + buffoffset)
value = unpack_func(cast(cursor,
POINTER(c_type)).contents)
buffoffset += sizeof(c_type) if iectype != "STRING" else len(value)+1
if buffoffset and buffoffset == buffsize:
LogLevels = ["CRITICAL", "WARNING", "INFO", "DEBUG"]
LogLevelsCount = len(LogLevels)
LogLevelsDict = dict(zip(LogLevels, range(LogLevelsCount)))
LogLevelsDefault = LogLevelsDict["DEBUG"]