ems/CAN/Filter.py

138 lines
5 KiB
Python

#!/usr/bin/env python
# -*- coding: utf8 -*-
'''
Created on 13.11.2013
@author: Philipp Rauch
@version: 0.1
'''
from PCan import PcanAdapter
from Sym2Lib import Add2Adapter, _get_easy_Dict_, readSym
from datetime import datetime
from time import sleep
from threading import Thread
from pandas import DataFrame
from profile.database import Database
debug = True
intervall = 100
def CAN_start(conf):
'''
start CAN communication
'''
if conf['config_debug']:
print 'starte CAN mit Baud von', conf['can_baudrate']
can = CANFilter(conf)
if conf['config_debug']:
print 'CAN-Thread:\t', can
can.start()
def get_DataFrameDict(symfile):
'''
generate a from a symfile a dictionary with all messages and DataFrames
'''
mes = readSym(symfile)
symDict = _get_easy_Dict_(mes)
dfDict = {}
for i in symDict.keys():
dfDict.update( { i : DataFrame(columns = symDict[i]) } )
return dfDict
class CANFilter(Thread):
### Lookup for CAN --> DB ###
lookup = {
'U_IST_WERT' : 'U_IST',
'I_IST_WERT' : 'I_IST',
'TEMPEARTUR' : 'temperature',
'STATUS_FPGA' : 'status',
'I_PH_WERT' : 'I_PH'
}
prefix = "GRIDManager_"
postfix = "_neu"
def __init__(self, conf):
'''
Initialize database and pcan adapter
and a list of DataFrameDicts
'''
Thread.__init__(self)
self.conf = conf
### init DB ###
self.db = Database()
self.db.loadDatabase(strHost = self.conf['mySQL_server'],
intPort = int(self.conf['mySQL_port']),
strUser = self.conf['mySQL_user'],
strPasswd = self.conf['mySQL_pass'],
strDatabase = self.conf['mySQL_database'],
strTable = None)
self.symList = []
### init PCAN ###
self.pcan = PcanAdapter(PcanAdapter.Baudrate[self.conf['can_baudrate']],
debug = self.conf['config_debug'])
self.pcan.initialize()
if isinstance(self.conf['can_symfile'], str):
sym = '%s/%s' % (self.conf['config_dictionary'],
self.conf['can_symfile'])
self.symList.append(get_DataFrameDict(sym))
if self.conf['config_debug']:
Add2Adapter(self.pcan, sym, toPrint = True)
else:
Add2Adapter(self.pcan, sym, toPrint = False)
elif isinstance(self.conf['can_symfile'], list):
for element in self.conf['can_symfile']:
sym = '%s/%s' % (self.conf['config_dictionary'], element)
self.symList.append(get_DataFrameDict(sym))
if self.conf['config_debug']:
Add2Adapter(self.pcan, sym, toPrint = True)
else:
Add2Adapter(self.pcan, sym, toPrint = False)
def run(self):
'''
get message and write it to database
'''
while True:
receiveMessageName = self.pcan.receiveMessage(block = True)
try:
tablename = "%s%s%s" % (self.prefix, self.lookup[receiveMessageName], self.postfix)
except:
tablename = "%s%s%s" % (self.prefix, receiveMessageName, self.postfix)
# if receiveMessageName is None or self.pcan.Messages[receiveMessageName].getFlag('RECEIVE'):
# continue
#print "%s - %s" % (datetime.now(), tablename)
for sym in self.symList:
if receiveMessageName in sym.keys():
tmp = {}
for sig in list(sym[receiveMessageName].columns):
data = self.pcan.Messages[receiveMessageName].Signals[sig].GetData()
if self.pcan.Messages[receiveMessageName].Signals[sig].Enum is not None:
data = self.pcan.Messages[receiveMessageName].Signals[sig].Enum[data]
tmp[sig] = data
sym[receiveMessageName] = sym[receiveMessageName].append(tmp, ignore_index=True)
if len(sym[receiveMessageName].index) == int(1/(0.001 * intervall)):
#res = DataFrame(sym[receiveMessageName].mean(axis=0)).T
res = sym[receiveMessageName][-1:]
res = res.reset_index(drop = True)
#res.drop('isMaster', axis = 1, inplace = True)
#res.drop('isCharging', axis = 1, inplace = True)
res['DateTime'] = datetime.now()
#self.db.writeDatabase(strTable=self.lookup[receiveMessageName], dfData=res, bClear=False)
self.db.writeDatabase(strTable=tablename, dfData=res, bClear=False)
sym[receiveMessageName] = sym[receiveMessageName].drop(sym[receiveMessageName].index[:])
if self.conf['config_debug']:
print "%s - Write to DB - %s" % (res['DateTime'][0], tablename)
sleep(0.01)