# imports needed for the file convertion
import os
import sys
import time
import numpy as np

import library2    

class ABSClient:
    
    def __init__(self,ipSource="localhost", ipDestino="192.168.1.117", portDestino=7000):
        
        self.ipSource = ipSource
        self.ipDestino = ipDestino
        self.portDestino = portDestino
        
        self.createObjects()
        
    def createObjects(self):
        
        self.commObj = library2.TCPComm(self.ipSource, self.ipDestino, self.portDestino)
     
    def sendFile(self, filename):
        
        #From matriz to control module format 
        self.FuncionMaestra_GeneraFormatoControlCentral(filename)
        FileName = "FormatoControlCentral.txt"
        F_Obj = open(FileName,"r")
        FileList = F_Obj.readlines()
        F_Obj.close()
        FileStr = "".join(FileList)
        data = FileStr

        self.commObj.open_socket()        
#        self.commObj.sendData(cmd="SNDF", data=data, id = 117)
        self.commObj.sendData2(cmd="SNDF", data=data, ipDestino = self.ipDestino)
#        self.commObj.waitData()
        self.commObj.waitClient()
        self.commObj.close_socket()
        
    def changeBeam(self, newBeam):

        self.commObj.open_socket()
#        self.commObj.sendData(cmd="CHGB", data=newBeam, id = 117)
        self.commObj.sendData2(cmd="CHGB", data=newBeam, ipDestino = self.ipDestino)
#        self.commObj.waitData()
        self.commObj.waitClient()
        self.commObj.close_socket()
    
    def __writeFile(self, filename, data):

        fobj = open(filename,"w")
        fobj.writelines(data)
        fobj.close()
        
    def getStatus(self, data):

        self.commObj.open_socket()        
#        self.commObj.sendData(cmd="ANST", data = data, id = 117)
        self.commObj.sendData2(cmd="ANST", data = data, ipDestino = self.ipDestino)
#        ipSource, ipDestino, cmd, data = self.commObj.waitData()
        ipSource, ipDestino, cmd, data = self.commObj.waitClient()
        self.commObj.close_socket()
        self.__writeFile("report.txt", data)
        
##########
       
    def FuncionMaestra_GeneraFormatoControlCentral(self,archivo):
        """ Funcion que genera un archivo para el control central"""
    
    #    CarpetaDeTrabajo='/home/redes/ABS_Control_2012_09_24/Control_Module_v1_Client_09_24/'
        CarpetaDeTrabajo = os.getcwd() + '/'
        #print CarpetaDeTrabajo 
        #CarpetaDeTrabajo='/home/redes/workspace/ABS_Client_v2/Debug/'    
        
        def lst2string(lst):
            string=''
            for i in lst:
                string=string+i
            return string
    
        def string2lst(string):
            lst = []
            for i in string:
                lst.append(i)
            return lst
        
        
        def file1(string, type):
            lst = string2lst(archivo)
            fin = -1
            t = len(lst)
            for i in np.arange(-1,-t,-1):
                if lst[i]=='/':
                    fin=i
                    break   
            if type == '1':
                nombre2 = lst[fin+1:]
                nombre2[-1]='s'
                nombre2 = lst2string(nombre2)
                return nombre2
            if type == '2':
                nombre2 = lst[fin+1:]
                nombre2[-1]='1'
                nombre2 = lst2string(nombre2)
                return nombre2
        
        
        def EliminaSaltoDeLinea(cadena):
            i = 0
            for elemento in cadena:
                if elemento =='\n' or elemento =='\r':
                    pass
                else:
                    i=i+1
            return cadena [:i]
    
        def NumeroDeExperimentos(path):
            fichero1=open(path,'r')
            cont=0
            for cadena in fichero1:
                cont=cont+1
                if cont==3:
                    nexp=''
                    pos=0
                    for elemento in cadena:
                        pos=pos+1
                        if elemento=='=':
                            nexp=int(cadena[pos:])
                            return nexp
            fichero1.close()
        
        def Paridad(numero):
            if numero%2==0: return 'par'
            elif numero%2==1: return 'impar'
            
        def EvaluaCadena(cadena):
            if len(cadena)>35:
                if cadena[-1]=='$':
                    return cadena[-35:-2]
                elif cadena[-1]==']':
                    return cadena[-34:-1]
            else:
                return None
    
        def GuardaEnLista(path):
            fichero=open(path,'r')
            lista=[]
            for cadena in fichero:
                cadena = EliminaSaltoDeLinea(cadena)
                cadena = EvaluaCadena(cadena)
                if cadena != None:
                    lista.append(cadena)
            fichero.close()
            return lista
        
        def CreaFicherosPrevios():
            vector = GuardaEnLista(archivo)
            for i in range(1,NumeroDeExperimentos(archivo)+1):
                fichero =open(CarpetaDeTrabajo+str(i)+'.txt','w')
                for j in range(0,16):
                    fichero.write(vector[j+16*(i-1)]+'\n')
                fichero.close()
        
        def CapturaValoresEnArchivo(path,polarizacion='up'):
            fichero =open(path,'r')
            cnt=0
            lstup=[]
            lstdw=[]
            for cadena in fichero:
                cnt=cnt+1
                if cnt==5: 
                    su01=cadena[17:20]
                    su02=cadena[21:24]
                    su03=cadena[25:28]
                    su04=cadena[29:32]
                if cnt==6: 
                    su05=cadena[17:20]
                    su06=cadena[21:24]
                    su07=cadena[25:28]
                    su08=cadena[29:32]
                if cnt==7: 
                    su09=cadena[17:20]
                    su10=cadena[21:24]
                    su11=cadena[25:28]
                    su12=cadena[29:32]
                if cnt==8: 
                    su13=cadena[17:20]
                    su14=cadena[21:24]
                    su15=cadena[25:28]
                    su16=cadena[29:32]
                if cnt==13: 
                    sd01=cadena[17:20]
                    sd02=cadena[21:24]
                    sd03=cadena[25:28]
                    sd04=cadena[29:32]
                if cnt==14: 
                    sd05=cadena[17:20]
                    sd06=cadena[21:24]
                    sd07=cadena[25:28]
                    sd08=cadena[29:32]
                if cnt==15: 
                    sd09=cadena[17:20]
                    sd10=cadena[21:24]
                    sd11=cadena[25:28]
                    sd12=cadena[29:32]
                if cnt==16: 
                    sd13=cadena[17:20]
                    sd14=cadena[21:24]
                    sd15=cadena[25:28]
                    sd16=cadena[29:32]
            lstup=[su01,su02,su03,su04,su05,su06,su07,su08,su09,su10,su11,su12,su13,su14,su15,su16]
            lstdw=[sd01,sd02,sd03,sd04,sd05,sd06,sd07,sd08,sd09,sd10,sd11,sd12,sd13,sd14,sd15,sd16]
            if polarizacion=='up': 
                return lstup
            elif polarizacion=='dw':
                return lstdw
            fichero.close()

        def CapturaValoresEnArchivo2(path,polarizacion='up'):
            fichero =open(path,'r')
            cnt=0
            lstup=[]
            lstdw=[]
            for cadena in fichero:
                cnt=cnt+1
                if cnt==1:
                    nu01=cadena[1:4]
                    nu02=cadena[5:8]
                    nu03=cadena[9:12]
                    nu04=cadena[13:16] 
                    eu01=cadena[17:20]
                    eu02=cadena[21:24]
                    eu03=cadena[25:28]
                    eu04=cadena[29:32]
                if cnt==2:
                    nu05=cadena[1:4]
                    nu06=cadena[5:8]
                    nu07=cadena[9:12]
                    nu08=cadena[13:16] 
                    eu05=cadena[17:20]
                    eu06=cadena[21:24]
                    eu07=cadena[25:28]
                    eu08=cadena[29:32]
                if cnt==3:
                    nu09=cadena[1:4]
                    nu10=cadena[5:8]
                    nu11=cadena[9:12]
                    nu12=cadena[13:16] 
                    eu09=cadena[17:20]
                    eu10=cadena[21:24]
                    eu11=cadena[25:28]
                    eu12=cadena[29:32]
                if cnt==4:
                    nu13=cadena[1:4]
                    nu14=cadena[5:8]
                    nu15=cadena[9:12]
                    nu16=cadena[13:16] 
                    eu13=cadena[17:20]
                    eu14=cadena[21:24]
                    eu15=cadena[25:28]
                    eu16=cadena[29:32]
                if cnt==5:
                    wu01=cadena[1:4]
                    wu02=cadena[5:8]
                    wu03=cadena[9:12]
                    wu04=cadena[13:16] 
                    su01=cadena[17:20]
                    su02=cadena[21:24]
                    su03=cadena[25:28]
                    su04=cadena[29:32]
                if cnt==6:
                    wu05=cadena[1:4]
                    wu06=cadena[5:8]
                    wu07=cadena[9:12]
                    wu08=cadena[13:16] 
                    su05=cadena[17:20]
                    su06=cadena[21:24]
                    su07=cadena[25:28]
                    su08=cadena[29:32]
                if cnt==7:
                    wu09=cadena[1:4]
                    wu10=cadena[5:8]
                    wu11=cadena[9:12]
                    wu12=cadena[13:16] 
                    su09=cadena[17:20]
                    su10=cadena[21:24]
                    su11=cadena[25:28]
                    su12=cadena[29:32]
                if cnt==8:
                    wu13=cadena[1:4]
                    wu14=cadena[5:8]
                    wu15=cadena[9:12]
                    wu16=cadena[13:16] 
                    su13=cadena[17:20]
                    su14=cadena[21:24]
                    su15=cadena[25:28]
                    su16=cadena[29:32]
                if cnt==9:
                    nd01=cadena[1:4]
                    nd02=cadena[5:8]
                    nd03=cadena[9:12]
                    nd04=cadena[13:16] 
                    ed01=cadena[17:20]
                    ed02=cadena[21:24]
                    ed03=cadena[25:28]
                    ed04=cadena[29:32]
                if cnt==10:
                    nd05=cadena[1:4]
                    nd06=cadena[5:8]
                    nd07=cadena[9:12]
                    nd08=cadena[13:16]                    
                    ed05=cadena[17:20]
                    ed06=cadena[21:24]
                    ed07=cadena[25:28]
                    ed08=cadena[29:32]
                if cnt==11: 
                    nd09=cadena[1:4]
                    nd10=cadena[5:8]
                    nd11=cadena[9:12]
                    nd12=cadena[13:16]                    
                    ed09=cadena[17:20]
                    ed10=cadena[21:24]
                    ed11=cadena[25:28]
                    ed12=cadena[29:32]
                if cnt==12: 
                    nd13=cadena[1:4]
                    nd14=cadena[5:8]
                    nd15=cadena[9:12]
                    nd16=cadena[13:16]
                    ed13=cadena[17:20]
                    ed14=cadena[21:24]
                    ed15=cadena[25:28]
                    ed16=cadena[29:32]                
                if cnt==13:
                    wd01=cadena[1:4]
                    wd02=cadena[5:8]
                    wd03=cadena[9:12]
                    wd04=cadena[13:16] 
                    sd01=cadena[17:20]
                    sd02=cadena[21:24]
                    sd03=cadena[25:28]
                    sd04=cadena[29:32]
                if cnt==14:
                    wd05=cadena[1:4]
                    wd06=cadena[5:8]
                    wd07=cadena[9:12]
                    wd08=cadena[13:16]                    
                    sd05=cadena[17:20]
                    sd06=cadena[21:24]
                    sd07=cadena[25:28]
                    sd08=cadena[29:32]
                if cnt==15: 
                    wd09=cadena[1:4]
                    wd10=cadena[5:8]
                    wd11=cadena[9:12]
                    wd12=cadena[13:16]                    
                    sd09=cadena[17:20]
                    sd10=cadena[21:24]
                    sd11=cadena[25:28]
                    sd12=cadena[29:32]
                if cnt==16: 
                    wd13=cadena[1:4]
                    wd14=cadena[5:8]
                    wd15=cadena[9:12]
                    wd16=cadena[13:16]
                    sd13=cadena[17:20]
                    sd14=cadena[21:24]
                    sd15=cadena[25:28]
                    sd16=cadena[29:32]
            lst_n_up=[nu01,nu02,nu03,nu04,nu05,nu06,nu07,nu08,nu09,nu10,nu11,nu12,nu13,nu14,nu15,nu16]
            lst_n_dw=[nd01,nd02,nd03,nd04,nd05,nd06,nd07,nd08,nd09,nd10,nd11,nd12,nd13,nd14,nd15,nd16]
            lst_s_up=[su01,su02,su03,su04,su05,su06,su07,su08,su09,su10,su11,su12,su13,su14,su15,su16]
            lst_s_dw=[sd01,sd02,sd03,sd04,sd05,sd06,sd07,sd08,sd09,sd10,sd11,sd12,sd13,sd14,sd15,sd16]
            lst_w_up=[wu01,wu02,wu03,wu04,wu05,wu06,wu07,wu08,wu09,wu10,wu11,wu12,wu13,wu14,wu15,wu16]
            lst_w_dw=[wd01,wd02,wd03,wd04,wd05,wd06,wd07,wd08,wd09,wd10,wd11,wd12,wd13,wd14,wd15,wd16]
            lst_e_up=[eu01,eu02,eu03,eu04,eu05,eu06,eu07,eu08,eu09,eu10,eu11,eu12,eu13,eu14,eu15,eu16]
            lst_e_dw=[ed01,ed02,ed03,ed04,ed05,ed06,ed07,ed08,ed09,ed10,ed11,ed12,ed13,ed14,ed15,ed16]
            
            lstup = lst_s_up +  lst_w_up + lst_n_up +  lst_e_up
            lstdw = lst_s_dw +  lst_w_dw + lst_n_up +  lst_e_up
            
            if polarizacion=='up': 
                return lstup
            elif polarizacion=='dw':
                return lstdw
            fichero.close()
                        

        def CreaFormatoFinal():
            ne=NumeroDeExperimentos(archivo)
            
            #nombre01 = file1(archivo,'1')
            nombre02 = file1(archivo,'2')
            fichero=open(CarpetaDeTrabajo+'FormatoControlCentral.txt','w')
            fichero.write(nombre02+'\n')        
            fichero.write(str(ne)+'\n')
            for i in range(1,17):
                
                if i<10:
                    nmod = '0'+str(i)
                else: nmod = str(i)
                
                
                fichero.write('S'+nmod+'\n')
                for j in range(1,ne+1):
                    ruta=CarpetaDeTrabajo+str(j)+'.txt'
                    lu=CapturaValoresEnArchivo(ruta,polarizacion='up')
                    ld=CapturaValoresEnArchivo(ruta,polarizacion='dw')
                    part1=''
                    part2=''
                    if lu[i-1]=='1.0': part1='000'
                    if lu[i-1]=='2.0': part1='001'
                    if lu[i-1]=='3.0': part1='010'
                    if lu[i-1]=='0.0': part1='011'
                    if lu[i-1]=='0.5': part1='100'
                    if lu[i-1]=='1.5': part1='101'
                    if lu[i-1]=='2.5': part1='110'
                    if lu[i-1]=='3.5': part1='111'
                    if ld[i-1]=='1.0': part2='000'
                    if ld[i-1]=='2.0': part2='001'
                    if ld[i-1]=='3.0': part2='010'
                    if ld[i-1]=='0.0': part2='011'
                    if ld[i-1]=='0.5': part2='100'
                    if ld[i-1]=='1.5': part2='101'
                    if ld[i-1]=='2.5': part2='110'
                    if ld[i-1]=='3.5': part2='111'
                    fichero.write(part1+part2+'\n')
                fichero.write('------'+'\n')
            fichero.close()
            
        def CreaFormatoFinal2():
            ne=NumeroDeExperimentos(archivo)
            
            #nombre01 = file1(archivo,'1')
            nombre02 = file1(archivo,'2')
            fichero=open(CarpetaDeTrabajo+'FormatoControlCentral.txt','w')
            fichero.write(nombre02+'\n')        
            fichero.write(str(ne)+'\n')

            for i in range(1,65):
                
                if i<10:
                    nmod = '0'+str(i)
                else: nmod = str(i)
                
                fichero.write("ABS_" + nmod+'\n')
                
                for j in range(1,ne+1):
                    ruta=CarpetaDeTrabajo+str(j)+'.txt'
                    lu=CapturaValoresEnArchivo2(ruta,polarizacion='up')
                    ld=CapturaValoresEnArchivo2(ruta,polarizacion='dw')
                    part1=''
                    part2=''
                    if lu[i-1]=='1.0': part1='000'
                    if lu[i-1]=='2.0': part1='001'
                    if lu[i-1]=='3.0': part1='010'
                    if lu[i-1]=='0.0': part1='011'
                    if lu[i-1]=='0.5': part1='100'
                    if lu[i-1]=='1.5': part1='101'
                    if lu[i-1]=='2.5': part1='110'
                    if lu[i-1]=='3.5': part1='111'
                    if ld[i-1]=='1.0': part2='000'
                    if ld[i-1]=='2.0': part2='001'
                    if ld[i-1]=='3.0': part2='010'
                    if ld[i-1]=='0.0': part2='011'
                    if ld[i-1]=='0.5': part2='100'
                    if ld[i-1]=='1.5': part2='101'
                    if ld[i-1]=='2.5': part2='110'
                    if ld[i-1]=='3.5': part2='111'
                    fichero.write(part1+part2+'\n')
                fichero.write('------'+'\n')
            fichero.close()
        
        def EliminaArchivosEnLaCarpeta():
            ne=NumeroDeExperimentos(archivo)   
            for i in range(1,ne+1):
                os.remove(CarpetaDeTrabajo+str(i)+'.txt')        
            
        CreaFicherosPrevios()
        CreaFormatoFinal2()
        EliminaArchivosEnLaCarpeta()
    
##########

if __name__ == '__main__':
    
    filename = "experimento1.abs"
    
    absObj = ABSClient()
#    absObj.sendFile(filename)
#    absObj.changeBeam("0")
    absObj.changeBeam("1")
#    absObj.changeBeam("2")
#    absObj.changeBeam("3")
#    absObj.changeBeam("4")
#    absObj.changeBeam("5")
#    absObj.changeBeam("6")
#    absObj.changeBeam("7")
#    absObj.getStatus(5)