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:
parent
8b43ba9c31
commit
65b371fc25
4 changed files with 95 additions and 20 deletions
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue