#!/usr/bin/env python #-*- coding: iso8859-15 -*- ########################################################## # CONFIG SENALES v1.0 # ########################################################## # Autor: Juan Miguel Taboada Godoy # # Fecha: Malaga, 03 de agosto de 2006 # # Descripción: Fichero de configuración de senales # # Versión: 2006080300 # # # # Codigo fuente bajo licencia GNU/GPL # # Centrologic (Computational Logistic Center) # # http://www.centrologic.com - info@centrologic.com # ########################################################## # Importo la cabecera de este fichero de configuracion from senales_cabecera import * # Libraries {{{1 import zipfile, xml.dom.minidom, sys # }}}1 # Function to calculate the time value {{{1 def calctime(trozo): # Es un dato normal, analizo su fuerza fuerza=trozo[-1] if (fuerza=="s"): # Segundos valor=int(trozo[:-1]) elif (fuerza=="m"): # Minutos valor=eval("%s*%s" % (60,trozo[:-1])) elif (fuerza=="h"): # Horas valor=eval("%s*%s" % (3600,trozo[:-1])) elif (fuerza=="d"): # Dias valor=eval("%s*%s" % (86400,trozo[:-1])) elif ((fuerza=="S") or (fuerza=="W")): # Semanas valor=eval("%s*%s" % (86400*7,trozo[:-1])) elif (fuerza=="M"): # Meses valor=eval("%s*%s" % (86400*30,trozo[:-1])) elif ((fuerza=="A") or (fuerza=="Y")): # Anyos valor=eval("%s*%s" % (86400*365,trozo[:-1])) else: valor=int(trozo) # Return the result return valor # }}}1 campos_totales=14 # Open the file {{{1 zip = zipfile.ZipFile("src/etcbin/senales.ods") # }}}1 # Process the file with minidom library {{{1 content = xml.dom.minidom.parseString(zip.read("content.xml")) # }}}1 # Look for the body {{{1 for node in content.firstChild.childNodes: if (node.localName=="body"): body=node break # }}}1 # Save the tree {{{1 tree=[] for node in body.firstChild.firstChild.childNodes: # If is a row if (node.localName=="table-row"): row=[] column_count=0 # For each column of the row for part in node.childNodes[0:-1]: # Check if this cell is a composed cell repeticiones=part.getAttribute("table:number-columns-repeated") # If is composed if (repeticiones!=""): # Add all missing cells for i in range(0,int(repeticiones)): row.append(None) # Count another column added column_count+=1 else: # If is not composed and doesn't have children add an empty cell if (part.childNodes==[]): row.append(None) # Count another column added column_count+=1 # For all the cells for part2 in part.childNodes: # If the cell is empty if (part.firstChild.childNodes==[]): # Save an empty cell row.append(None) else: # If the cell is not empty save the value row.append(part2.firstChild.nodeValue) # Count another column added column_count+=1 for i in range(column_count,campos_totales): row.append(None) # If there is data, save it in the tree empty=True for element in row: if (element!=None): empty=False # Save the row if (not empty): tree.append(row) # }}}1 # Test of the header {{{1 cabecera=['Descripcion','A/D','Frecuencia','En BD','RTU','ID','Direccion','Zona','Variante','Interprete RTU','Logico Inicio','Logico Fin','Fisico Inicio','Fisico Fin'] if (tree[0][0:campos_totales]!=cabecera): raise IOError,"Cabecera incorrecta, fichero con formato desconocido" # }}}1 # Process the list of signals {{{1 for senal in tree[1:]: # Obtengo las variables internas {{{2 (descripcion,ad,frecuencia,enBD,rtu,id,direccion,zona,variante,interprete,logicoini,logicofin,fisicoini,fisicofin)=senal[0:campos_totales] # }}}2 # Filtros {{{2 # Ajuste del enBD {{{3 enBD=(enBD.upper()=="SI") # }}}3 # Ajuste del variante {{{3 if (variante==None): variante="" # }}}3 # Ajuste del interprete {{{3 if (interprete==None): interprete="" else: interprete=":%s" % (interprete) # }}}3 # Calculo la direccion {{{3 conector=direccion if (zona==None): # Interpreto el campo de direccion inteligentemente # MOMENTUM if (direccion[0]=="0"): zona="sd" conector=int(direccion[1:]) elif (direccion[0]=="1"): zona="ed" conector=int(direccion[1:]) elif (direccion[0]=="3"): zona="sa" conector=int(direccion[1:]) elif (direccion[0]=="4"): zona="ea" conector=int(direccion[1:]) # PESYR elif (direccion[0:2]=="EA"): zona="ea" conector=direccion[2:] if ((variante!="max") and (variante!="min") and (variante!="med") and (variante!="dig")): raise IOError,"Error en senal %s: todas las senales analogicas basadas en sistemas PESYR necesitan tener un variante." % (id) elif (variante=="dig"): variante="" elif (direccion[0:2]=="EC"): zona="ec" conector=direccion[2:] variante="" elif (direccion[0:2]=="ED"): zona="ed" if (direccion[2]=="A"): conector=8 elif (direccion[2]=="B"): conector=9 elif (direccion[2]=="C"): conector=10 elif (direccion[2]=="D"): conector=11 elif (direccion[2]=="E"): conector=12 elif (direccion[2]=="F"): conector=13 elif (direccion[2]=="G"): conector=14 elif (direccion[2]=="H"): conector=15 else: conector=int(direccion[2]) elif (direccion=="SRA"): zona="sr" conector=0 elif (direccion=="SRB"): zona="sr" conector=1 elif (direccion=="SBT"): zona="be" conector=0 # Si zona aun es nula if (zona==None): posicion="%s" % (conector) elif (zona.lower()=="calc"): posicion="calc" else: posicion="%s%s:%s%s" % (zona,variante,conector,interprete) # }}}3 # AJusto la frecuencia {{{3 frecuencia=calctime(frecuencia) # }}}3 # Genero la lista de parametros {{{3 # Creo la salida estándar argumentos=[0,id,rtu,descripcion,enBD,posicion,ad,frecuencia] # Inserto los valores que se hayan declarado posteriormente if (logicoini!=None): logicoini=logicoini.replace(",",".") if (logicofin!=None): logicofin=logicofin.replace(",",".") argumentos.append((float(logicoini),float(logicofin))) else: argumentos.append((float(logicoini),None)) if (fisicoini!=None): fisicoini=fisicoini.replace(",",".") if (fisicofin!=None): fisicofin=fisicofin.replace(",",".") argumentos.append((float(fisicoini),float(fisicofin))) else: argumentos.append((float(fisicoini),None)) # }}}3 # }}}2 # Cargo la senal en el objeto de senales {{{2 try: s.add(*argumentos) except IOError,e: print "ERROR: procesando la lista de argumentos %s. ERROR: %s" % (argumentos,e) # }}}2 # }}}1