ems/CAN/Filter.py

114 lines
4.2 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):
print 'starte CAN mit Baud von', conf['can_baudrate']
can = CANFilter(conf)
can.start()
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
class CANFilter(Thread):
### Lookup für CAN --> DB ###
lookup = {
'U_IST_WERT' : 'GRIDManager_U_IST',
'I_IST_WERT' : 'GRIDManager_I_IST',
'TEMPEARTUR' : 'GRIDManager_Temperatur',
'STATUS_FPGA' : 'GRIDManager_Status',
'I_PH_WERT' : 'GRIDManager_I_PH'
}
def __init__(self, conf):
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))
Add2Adapter(self.pcan, sym)
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))
Add2Adapter(self.pcan, sym)
def run(self):
while True:
receiveMessageName = self.pcan.receiveMessage(block = True)
try:
tablename = self.lookup[receiveMessageName]
except:
tablename = receiveMessageName
# 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(self.lookup[receiveMessageName], res)
self.db.writeDatabase(strTable=tablename, dfData=res, bClear=False)
sym[receiveMessageName] = sym[receiveMessageName].drop(sym[receiveMessageName].index[:])
print "%s - Write to DB - %s" % (res['DateTime'][0], tablename)
#sleep(0.01)