Controller.py
276 lines
| 8.7 KiB
| text/x-python
|
PythonLexer
|
r103 | ''' | |
Created on June 5, 2012 | |||
$Author$ | |||
$Id$ | |||
''' | |||
import os | |||
import sys | |||
import datetime | |||
import ConfigParser | |||
path = os.path.split(os.getcwd())[0] | |||
sys.path.append(path) | |||
from Model.Voltage import Voltage | |||
from IO.VoltageIO import * | |||
from Model.Spectra import Spectra | |||
from IO.SpectraIO import * | |||
from Processing.VoltageProcessor import * | |||
from Processing.SpectraProcessor import * | |||
class Operation: | |||
def __init__(self,name,parameters): | |||
self.name = name | |||
self.parameters = [] | |||
parametersList = parameters.split(',') | |||
nparms = len(parametersList)/2 | |||
for id in range(nparms): | |||
parmtype = parametersList[id*2] | |||
value = parametersList[id*2+1] | |||
if value == 'None': | |||
value = None | |||
else: | |||
if parmtype == 'int': | |||
value = int(value) | |||
elif parmtype == 'float': | |||
value = float(value) | |||
elif parmtype == 'str': | |||
value = str(value) | |||
elif parmtype == 'datetime': | |||
value = value.split('-'); value = numpy.asarray(value,dtype=numpy.int32) | |||
value = datetime.datetime(value[0],value[1],value[2],value[3],value[4],value[5]) | |||
else: | |||
value = None | |||
self.parameters.append(value) | |||
class ExecUnit: | |||
def __init__(self,): | |||
self.id = None | |||
self.type = None | |||
self.execObjIn = None | |||
self.execObjOut = None | |||
self.execProcObj = None | |||
self.input = None | |||
self.operationList = [] | |||
self.flagSetIO = False | |||
def setIO(self): | |||
self.execProcObj.setIO(self.execObjIn,self.execObjOut) | |||
self.flagSetIO = True | |||
def Pfunction(self,name): | |||
def setup(*args): | |||
inputs = args[0] | |||
if self.type == 'VoltageReader': | |||
path = inputs[0] | |||
startDateTime = inputs[1] | |||
endDateTime = inputs[2] | |||
set = inputs[3] | |||
expLabel = inputs[4] | |||
ext = inputs[5] | |||
online = inputs[6] | |||
return self.execProcObj.setup(path,startDateTime,endDateTime,set,expLabel,ext,online) | |||
if self.type == 'Voltage': | |||
return self.execProcObj.setup() | |||
if self.type == 'Spectra': | |||
nFFTPoints = inputs[0] | |||
pairList = inputs[1] | |||
return self.execProcObj.setup(nFFTPoints,pairList) | |||
def getData(*args): | |||
return self.execProcObj.getData() | |||
def init(*args): | |||
inputs = args[0] | |||
parm1 = inputs[0] | |||
if self.type == 'Voltage': | |||
return self.execProcObj.init() | |||
if self.type == 'Spectra': | |||
return self.execProcObj.init() | |||
def plotData(*args): | |||
inputs = args[0] | |||
if self.type == 'Voltage': | |||
xmin = inputs[0] | |||
xmax = inputs[1] | |||
ymin = inputs[2] | |||
ymax = inputs[3] | |||
type = inputs[4] | |||
winTitle = inputs[5] | |||
index = inputs[6] | |||
return self.execProcObj.plotData(xmin,xmax,ymin,ymax,type,winTitle,index) | |||
if self.type == 'Spectra': | |||
xmin = inputs[0] | |||
xmax = inputs[1] | |||
ymin = inputs[2] | |||
ymax = inputs[3] | |||
winTitle = inputs[4] | |||
index = inputs[5] | |||
return self.execProcObj.plotData(xmin,xmax,ymin,ymax,winTitle,index) | |||
def integrator(*args): | |||
inputs = args[0] | |||
N = inputs[0] | |||
|
r104 | timeInterval = inputs[1] | |
self.execProcObj.integrator(N, timeInterval) | |||
|
r103 | ||
pfuncDict = { "setup": setup, | |||
"getdata": getData, | |||
"init": init, | |||
"plotdata": plotData, | |||
"integrator": integrator} | |||
return pfuncDict[name] | |||
def run(self): | |||
nopers = len(self.operationList) | |||
for idOper in range(nopers): | |||
operObj = self.operationList[idOper] | |||
self.Pfunction(operObj.name)(operObj.parameters) | |||
class Controller: | |||
def __init__(self): | |||
self.sectionList = None | |||
self.execUnitList = None | |||
self.execObjList = None | |||
self.readConfigFile() | |||
self.createObjects() | |||
self.setupOjects() | |||
self.start() | |||
def readConfigFile(self, filename='experiment.cfg'): | |||
parser = ConfigParser.SafeConfigParser() | |||
parser.read(filename) | |||
self.sectionList = parser.sections() | |||
self.execUnitList = [] | |||
for section_name in self.sectionList: | |||
itemList = parser.items(section_name) | |||
self.execUnitList.append(itemList) | |||
def createObjects(self): | |||
self.execObjList = [] | |||
for itemList in self.execUnitList: | |||
execObj = ExecUnit() | |||
for item in itemList: | |||
name, value = item[0], item[1] | |||
if name == 'id': | |||
execObj.id = int(value) | |||
continue | |||
if name == 'type': | |||
execObj.type = value | |||
if value == 'VoltageReader': | |||
execObj.execObjOut = Voltage() | |||
execObj.execProcObj = VoltageReader(execObj.execObjOut) | |||
if value == 'SpectraReader': | |||
execObj.execObjOut = Spectra() | |||
execObj.execProcObj = SpectraReader(execObj.execObjOut) | |||
if value == 'CorrelationReader': | |||
execObj.execObjOut = Correlation() | |||
execObj.execProcObj = CorrelationReader(execObj.execObjOut) | |||
if value == 'Voltage': | |||
execObj.execProcObj = VoltageProcessor() | |||
execObj.execObjOut = Voltage() | |||
if value == 'Spectra': | |||
execObj.execProcObj = SpectraProcessor() | |||
execObj.execObjOut = Spectra() | |||
if value == 'Correlation': | |||
execObj.execProcObj = CorrelationProcessor() | |||
execObj.execObjOut = Correlation() | |||
elif name == 'input': | |||
execObj.input = int(value) | |||
else: | |||
operObj = Operation(name,value) | |||
if name != 'setup': | |||
execObj.operationList.append(operObj) | |||
else: | |||
execObj.Pfunction(name)(operObj.parameters) | |||
del(operObj) | |||
self.execObjList.append(execObj) | |||
del(execObj) | |||
def setupOjects(self): | |||
for objIndex in range(len(self.execObjList)): | |||
currExecObj = self.execObjList[objIndex] | |||
if not(currExecObj.type in ['VoltageReader','SpectraReader','CorrelationReader']): | |||
idSearch = currExecObj.input | |||
for objIndex2 in range(len(self.execObjList)): | |||
lastExecObj = self.execObjList[objIndex2] # este objeto si puede ser un readerl | |||
if lastExecObj.id == idSearch and currExecObj.flagSetIO == False: | |||
currExecObj.execObjIn = lastExecObj.execObjOut | |||
currExecObj.setIO() | |||
def start(self): | |||
while(True): | |||
for indexObj in range(len(self.execObjList)): | |||
ExecObj = self.execObjList[indexObj] | |||
ExecObj.run() | |||
readExecObj = self.execObjList[0] # se asume que el primer elemento es un Reader | |||
if readExecObj.execProcObj.flagNoMoreFiles: | |||
break | |||
if readExecObj.execProcObj.flagIsNewBlock: | |||
print 'Block No %04d, Time: %s' %(readExecObj.execProcObj.nTotalBlocks, | |||
datetime.datetime.fromtimestamp(readExecObj.execProcObj.m_BasicHeader.utc),) | |||
if __name__ == '__main__': | |||
Controller() | |||