# HG changeset patch # User Edouard Tisserant # Date 1301591389 -7200 # Node ID c6408f92da0a4afbbe048beb47b6db9c50d27d49 # Parent 3ece9ba72aafea5279377e16e3e780101a69bc12 Initial TIME support in debugger diff -r 3ece9ba72aaf -r c6408f92da0a connectors/LPC/LPCAppObject.py --- a/connectors/LPC/LPCAppObject.py Thu Mar 31 19:04:03 2011 +0200 +++ b/connectors/LPC/LPCAppObject.py Thu Mar 31 19:09:49 2011 +0200 @@ -25,6 +25,7 @@ import ctypes from LPCAppProto import * from LPCObject import * +from targets.typemapping import SameEndianessTypeTranslator as TypeTranslator class LPCAppObject(LPCObject): def connect(self,comport): diff -r 3ece9ba72aaf -r c6408f92da0a plugger.py --- a/plugger.py Thu Mar 31 19:04:03 2011 +0200 +++ b/plugger.py Thu Mar 31 19:09:49 2011 +0200 @@ -680,29 +680,11 @@ from TextViewer import TextViewer from plcopen.structures import IEC_KEYWORDS, TypeHierarchy_list -# Construct debugger natively supported types -DebugTypes = [t for t in zip(*TypeHierarchy_list)[0] if not t.startswith("ANY")] -DebugTypesSize = {"BOOL" : 1, - "SINT" : 1, - "USINT" : 1, - "BYTE" : 1, - "STRING" : 128, - "INT" : 2, - "UINT" : 2, - "WORD" : 2, - "WSTRING" : 0, #TODO - "DINT" : 4, - "UDINT" : 4, - "DWORD" : 4, - "LINT" : 4, - "ULINT" : 8, - "LWORD" : 8, - "REAL" : 4, - "LREAL" : 8, - } import re, tempfile import targets +from targets.typemapping import DebugTypesSize + import connectors from discovery import DiscoveryDialog from weakref import WeakKeyDictionary @@ -1346,7 +1328,7 @@ "IN":" (*fp)((void*)&%(C_path)s,%(type)s_P_ENUM);\n", "OUT":" (*fp)((void*)&%(C_path)s,%(type)s_O_ENUM);\n", "VAR":" (*fp)((void*)&%(C_path)s,%(type)s_ENUM);\n"}[v["vartype"]]%v - for v in self._VariablesList if v["vartype"] != "FB" and v["type"] in DebugTypes ]), + for v in self._VariablesList if v["vartype"] != "FB" and v["type"] in DebugTypesSize ]), "find_variable_case_code":"\n".join([ " case %(num)s:\n"%v+ " *varp = (void*)&%(C_path)s;\n"%v+ @@ -1354,7 +1336,7 @@ "IN":" return %(type)s_P_ENUM;\n", "OUT":" return %(type)s_O_ENUM;\n", "VAR":" return %(type)s_ENUM;\n"}[v["vartype"]]%v - for v in self._VariablesList if v["vartype"] != "FB" and v["type"] in DebugTypes ])} + for v in self._VariablesList if v["vartype"] != "FB" and v["type"] in DebugTypesSize ])} return debug_code @@ -1604,7 +1586,10 @@ # Convert Idx, IEC_Type = self._IECPathToIdx.get(IECPath,(None,None)) if Idx is not None: - Idxs.append((Idx, IEC_Type, fvalue, IECPath)) + if IEC_Type in DebugTypesSize: + Idxs.append((Idx, IEC_Type, fvalue, IECPath)) + else: + self.logger.write_warning(_("Debug : Unsuppoted type to debug %s\n")%IEC_Type) else: self.logger.write_warning(_("Debug : Unknown variable %s\n")%IECPath) for IECPathToPop in IECPathsToPop: diff -r 3ece9ba72aaf -r c6408f92da0a runtime/PLCObject.py --- a/runtime/PLCObject.py Thu Mar 31 19:04:03 2011 +0200 +++ b/runtime/PLCObject.py Thu Mar 31 19:09:49 2011 +0200 @@ -25,6 +25,8 @@ import Pyro.core as pyro from threading import Timer, Thread, Lock import ctypes, os, commands, types, sys +from datetime import timedelta as td +from targets.typemapping import SameEndianessTypeTranslator as TypeTranslator if os.name in ("nt", "ce"): from _ctypes import LoadLibrary as dlopen @@ -320,35 +322,7 @@ return False - class IEC_STRING(ctypes.Structure): - """ - Must be changed according to changes in iec_types.h - """ - _fields_ = [("len", ctypes.c_uint8), - ("body", ctypes.c_char * 126)] - - TypeTranslator = {"BOOL" : (ctypes.c_uint8, lambda x:x.value!=0, lambda t,x:t(x)), - "STEP" : (ctypes.c_uint8, lambda x:x.value, lambda t,x:t(x)), - "TRANSITION" : (ctypes.c_uint8, lambda x:x.value, lambda t,x:t(x)), - "ACTION" : (ctypes.c_uint8, lambda x:x.value, lambda t,x:t(x)), - "SINT" : (ctypes.c_int8, lambda x:x.value, lambda t,x:t(x)), - "USINT" : (ctypes.c_uint8, lambda x:x.value, lambda t,x:t(x)), - "BYTE" : (ctypes.c_uint8, lambda x:x.value, lambda t,x:t(x)), - "STRING" : (IEC_STRING, lambda x:x.body[:x.len], lambda t,x:t(len(x),x)), - "INT" : (ctypes.c_int16, lambda x:x.value, lambda t,x:t(x)), - "UINT" : (ctypes.c_uint16, lambda x:x.value, lambda t,x:t(x)), - "WORD" : (ctypes.c_uint16, lambda x:x.value, lambda t,x:t(x)), - "WSTRING" : (None, None, None),#TODO - "DINT" : (ctypes.c_int32, lambda x:x.value, lambda t,x:t(x)), - "UDINT" : (ctypes.c_uint32, lambda x:x.value, lambda t,x:t(x)), - "DWORD" : (ctypes.c_uint32, lambda x:x.value, lambda t,x:t(x)), - "LINT" : (ctypes.c_int64, lambda x:x.value, lambda t,x:t(x)), - "ULINT" : (ctypes.c_uint64, lambda x:x.value, lambda t,x:t(x)), - "LWORD" : (ctypes.c_uint64, lambda x:x.value, lambda t,x:t(x)), - "REAL" : (ctypes.c_float, lambda x:x.value, lambda t,x:t(x)), - "LREAL" : (ctypes.c_double, lambda x:x.value, lambda t,x:t(x)), - } - + def SetTraceVariablesList(self, idxs): """ Call ctype imported function to append @@ -392,7 +366,7 @@ c_type,unpack_func, pack_func = \ self.TypeTranslator.get(iectype, (None,None,None)) - if c_type is not None and offset < size: + if c_type is not None and offset < size.value: res.append(unpack_func( ctypes.cast(cursor, ctypes.POINTER(c_type)).contents)) @@ -401,14 +375,14 @@ if c_type is None: PLCprint("Debug error - " + iectype + " not supported !") - if offset >= size: - PLCprint("Debug error - buffer too small !") + #if offset >= size.value: + #PLCprint("Debug error - buffer too small ! %d != %d"%(offset, size.value)) break self._FreeDebugData() self.PLClibraryLock.release() if offset and offset == size.value: return self.PLCStatus, tick.value, res - elif size.value: - PLCprint("Debug error - wrong buffer unpack !") - return self.PLCStatus, None, None - + #elif size.value: + #PLCprint("Debug error - wrong buffer unpack ! %d != %d"%(offset, size.value)) + return self.PLCStatus, None, [] + diff -r 3ece9ba72aaf -r c6408f92da0a targets/Linux/plc_Linux_main.c --- a/targets/Linux/plc_Linux_main.c Thu Mar 31 19:04:03 2011 +0200 +++ b/targets/Linux/plc_Linux_main.c Thu Mar 31 19:09:49 2011 +0200 @@ -20,7 +20,10 @@ void PLC_GetTime(IEC_TIME *CURRENT_TIME) { - clock_gettime(CLOCK_REALTIME, CURRENT_TIME); + struct timespec tmp; + clock_gettime(CLOCK_REALTIME, &tmp); + CURRENT_TIME->tv_sec = tmp.tv_sec; + CURRENT_TIME->tv_nsec = tmp.tv_nsec; } void PLC_timer_notify(sigval_t val) diff -r 3ece9ba72aaf -r c6408f92da0a targets/typemapping.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/targets/typemapping.py Thu Mar 31 19:09:49 2011 +0200 @@ -0,0 +1,73 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +#Copyright (C) 2011: Edouard TISSERANT and Laurent BESSARD +# +#See COPYING file for copyrights details. +# +#This library is free software; you can redistribute it and/or +#modify it under the terms of the GNU 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 +#General Public License for more details. +# +#You should have received a copy of the GNU General Public +#License along with this library; if not, write to the Free Software +#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +from ctypes import * + +class IEC_STRING(Structure): + """ + Must be changed according to changes in iec_types.h + """ + _fields_ = [("len", c_uint8), + ("body", c_char * 126)] + +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)): return (t, u, p) + +SameEndianessTypeTranslator = { + "BOOL" : _t(c_uint8, lambda x:x.value!=0), + "STEP" : _t(c_uint8), + "TRANSITION" : _t(c_uint8), + "ACTION" : _t(c_uint8), + "SINT" : _t(c_int8), + "USINT" : _t(c_uint8), + "BYTE" : _t(c_uint8), + "STRING" : _t(IEC_STRING, + lambda x:x.body[:x.len], + lambda t,x:t(len(x),x)), + "INT" : _t(c_int16), + "UINT" : _t(c_uint16), + "WORD" : _t(c_uint16), + "DINT" : _t(c_int32), + "UDINT" : _t(c_uint32), + "DWORD" : _t(c_uint32), + "LINT" : _t(c_int64), + "ULINT" : _t(c_uint64), + "LWORD" : _t(c_uint64), + "REAL" : _t(c_float), + "LREAL" : _t(c_double), + "TIME" : _t(IEC_TIME, + lambda x:td(0, x.s, x.ns/1000), + lambda t,x:t(x.seconds, x.microseconds*1000)), + } + +SwapedEndianessTypeTranslator = { + #TODO + } + +# Construct debugger natively supported types +DebugTypesSize = dict([(key,sizeof(t)) for key,(t,p,u) in SameEndianessTypeTranslator.iteritems() if t is not None]) +