diff -r 8872223a675b -r 4a45f6642523 targets/typemapping.py --- a/targets/typemapping.py Thu Jan 29 19:11:34 2015 +0100 +++ b/targets/typemapping.py Fri Jan 30 10:45:11 2015 +0100 @@ -19,6 +19,11 @@ #License along with this library; if not, write to the Free Software #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +import ctypes +ctypes.pythonapi.PyString_AsString.argtypes = (ctypes.c_void_p,) +ctypes.pythonapi.PyString_AsString.restype = ctypes.POINTER(ctypes.c_char) + + from ctypes import * from datetime import timedelta as td @@ -27,7 +32,7 @@ Must be changed according to changes in iec_types.h """ _fields_ = [("len", c_uint8), - ("body", c_char * 126)] + ("body", c_char * 126)] class IEC_TIME(Structure): """ @@ -37,8 +42,8 @@ ("ns", c_long)] #tv_nsec def _t(t, u=lambda x:x.value, p=lambda t,x:t(x)): return (t, u, p) -def _ttime(): return (IEC_TIME, - lambda x:td(0, x.s, x.ns/1000), +def _ttime(): return (IEC_TIME, + lambda x:td(0, x.s, x.ns/1000), lambda t,x:t(x.days * 24 * 3600 + x.seconds, x.microseconds*1000)) SameEndianessTypeTranslator = { @@ -49,8 +54,8 @@ "SINT" : _t(c_int8), "USINT" : _t(c_uint8), "BYTE" : _t(c_uint8), - "STRING" : (IEC_STRING, - lambda x:x.body[:x.len], + "STRING" : (IEC_STRING, + lambda x:x.body[:x.len], lambda t,x:t(len(x),x)), "INT" : _t(c_int16), "UINT" : _t(c_uint16), @@ -67,38 +72,35 @@ "TOD" : _ttime(), "DATE" : _ttime(), "DT" : _ttime(), - } + } SwapedEndianessTypeTranslator = { #TODO - } + } 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, size, indexes): - res = [] - offset = 0 - for idx, iectype, forced in indexes: - cursor = c_void_p(buff.value + offset) +def UnpackDebugBuffer(buff, indexes): + res = [] + buffoffset = 0 + buffsize = len(buff) + buffptr = cast(ctypes.pythonapi.PyString_AsString(id(buff)),c_void_p).value + for iectype in indexes: c_type,unpack_func, pack_func = \ TypeTranslator.get(iectype, (None,None,None)) - if c_type is not None and offset < size: - res.append(unpack_func( - cast(cursor, - POINTER(c_type)).contents)) - offset += sizeof(c_type) if iectype != "STRING" else len(res[-1])+1 + 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 + res.append(value) else: - #if c_type is None: - # PLCprint("Debug error - " + iectype + - # " not supported !") - #if offset >= size: - # PLCprint("Debug error - buffer too small ! %d != %d"%(offset, size)) break - if offset and offset == size: + if buffoffset and buffoffset == buffsize: return res return None