DataFrame and Enum Support for Symfiles

* add support for enums in CanSignal and Sym2Lib
* add pandas DataFrame support in Sym2Lib
* add ID Handler in PCAN
* Change return value to Message-Name for the receiveMessage
This commit is contained in:
Philipp Rauch 2014-02-18 16:48:31 +01:00
parent 8b43ba9c31
commit 65b371fc25
4 changed files with 95 additions and 20 deletions

View file

@ -1,8 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?eclipse-pydev version="1.0"?>
<pydev_project>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
<?eclipse-pydev version="1.0"?><pydev_project>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">python</pydev_property>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
<path>/CANLibrary</path>

View file

@ -28,13 +28,15 @@ class CanSignal(object):
self.Length = SignalLength
self.Offset = SignalOffset
self.Scaling = SignalScaling
self.Label = SignalLabel
self.Data = []
self.SetData(SignalData)
self.Enum = None
self.SetData(SignalData)
def SetData(self, SignalData):
'''
Update the data of the Signal.
@ -47,14 +49,17 @@ class CanSignal(object):
self.Data = []
for i in range(0, int(self.Length/8)+1):
self.Data.append ( (tmpData >> (8*i) ) & 0xff )
def GetData(self):
'''
'''
tmpData = 0
for i in range(0, int(self.Length/8)+1):
tmpData += ( self.Data[i] << (8*i) )
tmpData = ( (tmpData * self.Scaling) + self.Offset )
return tmpData
return tmpData
def SetEnum(self, Enum):
self.Enum = Enum

View file

@ -55,6 +55,20 @@ class PcanAdapter(object):
self.Messages.update({CanMessage.Label: CanMessage})
def _getIDs_(self):
_ids_ = {}
for key in self.Messages.keys():
_ids_.update( { self.Messages[key].Id : key } )
return _ids_
def getMessageName(self, ID):
_ids_ = self._getIDs_()
if ID in _ids_.keys():
return _ids_[ID]
else:
print 'ERROR: Message ID %s not defined' % ID
return False
def removeMessage(self, CanMessageLabel):
try:
self.Messages.pop(CanMessageLabel)
@ -139,7 +153,7 @@ class PcanAdapter(object):
self.Messages[msgKey].Data[i] = msg.DATA[i]
self.Messages[msgKey].decomposeData()
self.Messages[msgKey].timestamp = timestamp.micros + 1000 * timestamp.millis + 0xFFFFFFFF * 1000 * timestamp.millis_overflow
return msg.ID
return msgKey
elif result == PCANBasic.PCAN_ERROR_QRCVEMPTY and block == False:
return None
sleep(0.01)
sleep(0.01)

View file

@ -9,13 +9,17 @@ Created on 12.12.2013
'''
from CanMessage import CanMessage
from CanSignal import CanSignal
from pandas import DataFrame
from pprint import pprint
def readSym(symfile):
sym = open(symfile, "r")
message = {}
tmp = {}
enums = {}
ignore = True
enums_bool = False
name = ""
for line in sym:
@ -35,16 +39,39 @@ def readSym(symfile):
if ignore and not line[0] == "{":
continue
elif enums_bool and not line[0] == "{":
arg = line.strip()
if arg.find("enum") == 0:
arg = line.split("(")
ident =arg[0].split(" ")[1]
enums[ident] = {}
arg = arg[1]
if ")" in arg:
arg = (arg.split(")"))[0]
tm = arg.split(",")
else:
tm = arg.split(",")
del tm[-1]
for i in range(len(tm)):
tm[i] = tm[i].split("=")
tm[i][0] = int(tm[i][0].strip())
tm[i][1] = tm[i][1].strip("\"")
for i in tm:
enums[ident][i[0]] = i[1]
if line[0] == "{":
ignore = False
enums_bool = False
modus = line.strip("{} \n")
if modus == "SEND":
if modus == "ENUMS":
enums_bool = True
ignore = False
elif modus == "SEND":
ignore = True
elif modus == "RECEIVE":
ignore = False
elif modus == "SENDRECEIVE":
ignore = False
ignore = True
elif modus == "VIRTUALVARS":
ignore = True
@ -103,6 +130,8 @@ def readSym(symfile):
signal["offset"] = int(a[1])
elif a[0] == "/d":
signal["data"] = float(a[1])
elif a[0] == "/e":
signal["enum"] = enums[a[1]]
tmp[titel] = signal
return message
@ -110,10 +139,15 @@ def readSym(symfile):
def Sym2Code(symfile, adapter = "pcan"):
mes = readSym(symfile)
for i in mes.keys():
if i == "ENUMS":
print { i : mes[i] }
continue
print "%s.addMessage(CanMessage(%s, %s, %s, %s)" % (adapter, hex(mes[i]["ID"]), mes[i]["DLC"], mes[i]["CycleTime"], i)
for sig in mes[i]:
if isinstance(mes[i].get(sig), dict):
print "%s.Messages[%s].addSignal(CanSignal(%s, %s, %s, %s, %s, %s)" % (adapter, i, mes[i][sig]["begin"], mes[i][sig]["length"], mes[i][sig]["offset"], mes[i][sig]["factor"], mes[i][sig]["data"], sig)
if "enum" in mes[i][sig].keys():
pprint({ "enum" : mes[i][sig]["enum"]})
print ""
def Add2Adapter(pcan, symfile):
@ -123,11 +157,14 @@ def Add2Adapter(pcan, symfile):
mes = readSym(symfile)
print ""
for i in mes.keys():
if i == "ENUMS":
continue
pcan.addMessage(CanMessage(mes[i]["ID"],
mes[i]["DLC"],
mes[i]["CycleTime"],
i))
print "add %s - %s to pcan" % (i, hex(mes[i]["ID"]))
print "add - %s (%s) - to pcan" % (i, hex(mes[i]["ID"]))
signals = []
for sig in mes[i]:
if isinstance(mes[i].get(sig), dict):
pcan.Messages[i].addSignal(CanSignal(mes[i][sig]["begin"],
@ -136,6 +173,27 @@ def Add2Adapter(pcan, symfile):
mes[i][sig]["factor"],
mes[i][sig]["data"],
sig))
print "add sig %s to msg %s" % (sig, i)
print ""
if "enum" in mes[i][sig].keys():
pcan.Messages[i].Signals[sig].SetEnum(mes[i][sig]["enum"])
signals.append(sig)
print ' signals: %s\n' % ', '.join(signals)
return pcan
def _get_easy_Dict_(mes):
symDict = {}
for i in mes.keys():
symDict[i] = []
for sig in mes[i]:
if isinstance(mes[i].get(sig), dict):
symDict[i].append(sig)
return symDict
def get_DataFrameDict(symfile):
mes = readSym(symfile)
symDict = _get_easy_Dict_(mes)
dfDict = {}
for i in symDict.keys():
dfDict.update( { i : DataFrame(columns = symDict[i]) } )
return dfDict
Sym2Code("H:\umzug desktop\Symboldatei_multiport.sym")