import numpy,math,random,time
#---------------1  Heredamos JRODatareader
from schainpy.model.io.jroIO_base import *
#---------------2 Heredamos las propiedades de ProcessingUnit
from schainpy.model.proc.jroproc_base import ProcessingUnit,Operation,MPDecorator
#---------------3 Importaremos las clases BascicHeader, SystemHeader, RadarControlHeader, ProcessingHeader
from schainpy.model.data.jroheaderIO import PROCFLAG, BasicHeader,SystemHeader,RadarControllerHeader, ProcessingHeader
#---------------4 Importaremos el objeto Voltge
from schainpy.model.data.jrodata import Voltage

class SimulatorReader(JRODataReader, ProcessingUnit):
    incIntFactor                   = 1
    nFFTPoints                     = 0
    FixPP_IncInt                   = 1
    FixRCP_IPP                     = 1000
    FixPP_CohInt                   = 1
    Tau_0                          = 250
    AcqH0_0                        = 70
    H0                             = AcqH0_0
    AcqDH_0                        = 1.25
    DH0                            = AcqDH_0
    Bauds                          = 32
    BaudWidth                      = None
    FixRCP_TXA                     = 40
    FixRCP_TXB                     = 70
    fAngle                         = 2.0*math.pi*(1/16)
    DC_level                       = 500
    stdev                          = 8
    Num_Codes                      = 2
    #code0                          = numpy.array([1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1])
    #code1                          = numpy.array([1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,1,1,0,0,0,1,0])
    #Dyn_snCode                     = numpy.array([Num_Codes,Bauds])
    Dyn_snCode                     = None
    Samples                        = 200
    channels                       = 2
    pulses                         = None
    Reference                      = None
    pulse_size                     = None
    prof_gen                       = None
    Fdoppler                       = 100
    Hdoppler                       = 36
    Adoppler                       = 300
    frequency                      = 9345
    nTotalReadFiles                = 1000

    def __init__(self):
        """
        Inicializador de la clases SimulatorReader para
        generar datos de voltage simulados.
        Input:
            dataOut: Objeto de la clase Voltage.
            Este Objeto sera utilizado apra almacenar
            un perfil de datos  cada vez qe se haga
            un requerimiento (getData)
        """
        ProcessingUnit.__init__(self)
        print(" [ START ] init - Metodo Simulator Reader")

        self.isConfig                  = False
        self.basicHeaderObj            = BasicHeader(LOCALTIME)
        self.systemHeaderObj           = SystemHeader()
        self.radarControllerHeaderObj  = RadarControllerHeader()
        self.processingHeaderObj       = ProcessingHeader()
        self.profileIndex              = 2**32-1
        self.dataOut                   = Voltage()
        #code0                          = numpy.array([1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1])
        code0                          = numpy.array([1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1])
        #code1                          = numpy.array([1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,1,1,0,0,0,1,0])
        code1                          = numpy.array([1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1])
        #self.Dyn_snCode                = numpy.array([code0,code1])
        self.Dyn_snCode                = None

    def set_kwargs(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)

    def __hasNotDataInBuffer(self):

        if self.profileIndex >= self.processingHeaderObj.profilesPerBlock* self.nTxs:
            if self.nReadBlocks>0:
                tmp                           = self.dataOut.utctime
                tmp_utc                       = int(self.dataOut.utctime)
                tmp_milisecond                = int((tmp-tmp_utc)*1000)
                self.basicHeaderObj.utc       = tmp_utc
                self.basicHeaderObj.miliSecond= tmp_milisecond
            return 1
        return 0

    def setNextFile(self):
        """Set the next file to be readed open it and parse de file header"""

        if (self.nReadBlocks >= self.processingHeaderObj.dataBlocksPerFile):
            self.nReadFiles=self.nReadFiles+1
            if self.nReadFiles > self.nTotalReadFiles:
                self.flagNoMoreFiles=1
                raise schainpy.admin.SchainWarning('No more files to read')

            print('------------------- [Opening file] ------------------------------',self.nReadFiles)
            self.nReadBlocks  = 0
        #if self.nReadBlocks==0:
        #    self.readFirstHeader()

    def __setNewBlock(self):
        self.setNextFile()
        if self.flagIsNewFile:
            return 1

    def readNextBlock(self):
        while True:
            self.__setNewBlock()
            if not(self.readBlock()):
                return 0
            self.getBasicHeader()
            break
        if self.verbose:
            print("[Reading] Block No. %d/%d -> %s" %(self.nReadBlocks,
                                                      self.processingHeaderObj.dataBlocksPerFile,
                                                      self.dataOut.datatime.ctime()) )
        return 1

    def getFirstHeader(self):
        self.getBasicHeader()
        self.dataOut.processingHeaderObj      = self.processingHeaderObj.copy()
        self.dataOut.systemHeaderObj          = self.systemHeaderObj.copy()
        self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
        self.dataOut.dtype       = self.dtype

        self.dataOut.nProfiles   = self.processingHeaderObj.profilesPerBlock
        self.dataOut.heightList  = numpy.arange(self.processingHeaderObj.nHeights) * self.processingHeaderObj.deltaHeight + self.processingHeaderObj.firstHeight
        self.dataOut.channelList = list(range(self.systemHeaderObj.nChannels))
        self.dataOut.nCohInt     = self.processingHeaderObj.nCohInt
        # asumo q la data no esta decodificada
        self.dataOut.flagDecodeData  = self.processingHeaderObj.flag_decode
        # asumo q la data no esta sin flip
        self.dataOut.flagDeflipData  = self.processingHeaderObj.flag_deflip
        self.dataOut.flagShiftFFT    = self.processingHeaderObj.shif_fft
        self.dataOut.frequency       = self.frequency

    def getBasicHeader(self):
        self.dataOut.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond / \
            1000. + self.profileIndex * self.radarControllerHeaderObj.ippSeconds

        self.dataOut.flagDiscontinuousBlock = self.flagDiscontinuousBlock
        self.dataOut.timeZone               = self.basicHeaderObj.timeZone
        self.dataOut.dstFlag                = self.basicHeaderObj.dstFlag
        self.dataOut.errorCount             = self.basicHeaderObj.errorCount
        self.dataOut.useLocalTime           = self.basicHeaderObj.useLocalTime
        self.dataOut.ippSeconds             = self.radarControllerHeaderObj.ippSeconds / self.nTxs

    def readFirstHeader(self):

        datatype = int(numpy.log2((self.processingHeaderObj.processFlags &
                                   PROCFLAG.DATATYPE_MASK)) - numpy.log2(PROCFLAG.DATATYPE_CHAR))
        if datatype == 0:
            datatype_str = numpy.dtype([('real', '<i1'), ('imag', '<i1')])
        elif datatype == 1:
            datatype_str = numpy.dtype([('real', '<i2'), ('imag', '<i2')])
        elif datatype == 2:
            datatype_str = numpy.dtype([('real', '<i4'), ('imag', '<i4')])
        elif datatype == 3:
            datatype_str = numpy.dtype([('real', '<i8'), ('imag', '<i8')])
        elif datatype == 4:
            datatype_str = numpy.dtype([('real', '<f4'), ('imag', '<f4')])
        elif datatype == 5:
            datatype_str = numpy.dtype([('real', '<f8'), ('imag', '<f8')])
        else:
            raise ValueError('Data type was not defined')

        self.dtype = datatype_str


    def set_RCH(self, expType=2, nTx=1,ipp=None, txA=0, txB=0,
                 nWindows=None, nHeights=None, firstHeight=None, deltaHeight=None,
                 numTaus=0, line6Function=0, line5Function=0, fClock=None,
                 prePulseBefore=0, prePulseAfter=0,
                 codeType=0, nCode=0, nBaud=0, code=None,
                 flip1=0, flip2=0,Taus=0):
        self.radarControllerHeaderObj.expType       = expType
        self.radarControllerHeaderObj.nTx           = nTx
        self.radarControllerHeaderObj.ipp           = float(ipp)
        self.radarControllerHeaderObj.txA           = float(txA)
        self.radarControllerHeaderObj.txB           = float(txB)
        self.radarControllerHeaderObj.rangeIpp      = b'A\n'#ipp
        self.radarControllerHeaderObj.rangeTxA      = b''
        self.radarControllerHeaderObj.rangeTxB      = b''

        self.radarControllerHeaderObj.nHeights      = int(nHeights)
        self.radarControllerHeaderObj.firstHeight   = numpy.array([firstHeight])
        self.radarControllerHeaderObj.deltaHeight   = numpy.array([deltaHeight])
        self.radarControllerHeaderObj.samplesWin    = numpy.array([nHeights])


        self.radarControllerHeaderObj.nWindows      = nWindows
        self.radarControllerHeaderObj.numTaus       = numTaus
        self.radarControllerHeaderObj.codeType      = codeType
        self.radarControllerHeaderObj.line6Function = line6Function
        self.radarControllerHeaderObj.line5Function = line5Function
        #self.radarControllerHeaderObj.fClock        = fClock
        self.radarControllerHeaderObj.prePulseBefore= prePulseBefore
        self.radarControllerHeaderObj.prePulseAfter = prePulseAfter

        self.radarControllerHeaderObj.flip1         = flip1
        self.radarControllerHeaderObj.flip2         = flip2

        self.radarControllerHeaderObj.code_size     = 0
        if self.radarControllerHeaderObj.codeType  != 0:
            self.radarControllerHeaderObj.nCode         = nCode
            self.radarControllerHeaderObj.nBaud         = nBaud
            self.radarControllerHeaderObj.code          = code
            self.radarControllerHeaderObj.code_size     = int(numpy.ceil(nBaud / 32.)) * nCode * 4

        if fClock is None and deltaHeight is not None:
            self.fClock = 0.15 / (deltaHeight * 1e-6)
            self.radarControllerHeaderObj.fClock     = self.fClock
        if numTaus==0:
            self.radarControllerHeaderObj.Taus       =  numpy.array(0,'<f4')
        else:
            self.radarControllerHeaderObj.Taus       = numpy.array(Taus,'<f4')

    def set_PH(self, dtype=0, blockSize=0, profilesPerBlock=0,
                  dataBlocksPerFile=0, nWindows=0, processFlags=0, nCohInt=0,
                  nIncohInt=0, totalSpectra=0, nHeights=0, firstHeight=0,
                  deltaHeight=0, samplesWin=0, spectraComb=0, nCode=0,
                  code=0, nBaud=None, shif_fft=False, flag_dc=False,
                  flag_cspc=False, flag_decode=False, flag_deflip=False):

        self.processingHeaderObj.dtype             = dtype
        self.processingHeaderObj.profilesPerBlock  = profilesPerBlock
        self.processingHeaderObj.dataBlocksPerFile = dataBlocksPerFile
        self.processingHeaderObj.nWindows          = nWindows
        self.processingHeaderObj.processFlags      = processFlags
        self.processingHeaderObj.nCohInt           = nCohInt
        self.processingHeaderObj.nIncohInt         = nIncohInt
        self.processingHeaderObj.totalSpectra      = totalSpectra

        self.processingHeaderObj.nHeights          = int(nHeights)
        self.processingHeaderObj.firstHeight       = firstHeight#numpy.array([firstHeight])#firstHeight
        self.processingHeaderObj.deltaHeight       = deltaHeight#numpy.array([deltaHeight])#deltaHeight
        self.processingHeaderObj.samplesWin        = nHeights#numpy.array([nHeights])#nHeights

    def set_BH(self, utc = 0, miliSecond = 0, timeZone = 0):
        self.basicHeaderObj.utc                    = utc
        self.basicHeaderObj.miliSecond             = miliSecond
        self.basicHeaderObj.timeZone               = timeZone

    def set_SH(self, nSamples=0, nProfiles=0, nChannels=0, adcResolution=14, pciDioBusWidth=32):
        #self.systemHeaderObj.size           = size
        self.systemHeaderObj.nSamples       = nSamples
        self.systemHeaderObj.nProfiles      = nProfiles
        self.systemHeaderObj.nChannels      = nChannels
        self.systemHeaderObj.adcResolution  = adcResolution
        self.systemHeaderObj.pciDioBusWidth = pciDioBusWidth

    def init_acquisition(self):

        if self.nFFTPoints != 0:
            self.incIntFactor = m_nProfilesperBlock/self.nFFTPoints
            if (self.FixPP_IncInt > self.incIntFactor):
                self.incIntFactor = self.FixPP_IncInt/ self.incIntFactor
            elif(self.FixPP_IncInt< self.incIntFactor):
                print("False alert...")

        ProfilesperBlock  = self.processingHeaderObj.profilesPerBlock

        self.timeperblock =int(((self.FixRCP_IPP
                        *ProfilesperBlock
                        *self.FixPP_CohInt
                        *self.incIntFactor)
                       /150.0)
                      *0.9
                      +0.5)
        # para cada canal
        self.profiles     =  ProfilesperBlock*self.FixPP_CohInt
        self.profiles     =  ProfilesperBlock
        self.Reference    =  int((self.Tau_0-self.AcqH0_0)/(self.AcqDH_0)+0.5)
        self.BaudWidth    =  int((self.FixRCP_TXA/self.AcqDH_0)/self.Bauds + 0.5 )

        if (self.BaudWidth==0):
            self.BaudWidth=1

    def init_pulse(self,Num_Codes=Num_Codes,Bauds=Bauds,BaudWidth=BaudWidth,Dyn_snCode=Dyn_snCode):

        Num_Codes   = Num_Codes
        Bauds       = Bauds
        BaudWidth   = BaudWidth
        Dyn_snCode  = Dyn_snCode

        if Dyn_snCode:
            print("EXISTE")
        else:
            print("No existe")

        if Dyn_snCode: # if Bauds:
            pulses         = list(range(0,Num_Codes))
            num_codes      = Num_Codes
            for i in range(num_codes):
                pulse_size = Bauds*BaudWidth
                pulses[i]  = numpy.zeros(pulse_size)
                for j in range(Bauds):
                    for k in range(BaudWidth):
                        pulses[i][j*BaudWidth+k] = int(Dyn_snCode[i][j]*600)
        else:
            print("sin code")
            pulses     = list(range(1))
            if self.AcqDH_0>0.149:
                pulse_size = int(self.FixRCP_TXB/0.15+0.5)
            else:
                pulse_size = int((self.FixRCP_TXB/self.AcqDH_0)+0.5) #0.0375
            pulses[0]  = numpy.ones(pulse_size)
            pulses     = 600*pulses[0]

        return pulses,pulse_size

    def jro_GenerateBlockOfData(self,Samples=Samples,DC_level= DC_level,stdev=stdev,
                                Reference= Reference,pulses= pulses,
                                Num_Codes= Num_Codes,pulse_size=pulse_size,
                                prof_gen= prof_gen,H0 = H0,DH0=DH0,
                                Adoppler=Adoppler,Fdoppler= Fdoppler,Hdoppler=Hdoppler):
        Samples    = Samples
        DC_level   = DC_level
        stdev      = stdev
        m_nR       = Reference
        pulses     = pulses
        num_codes  = Num_Codes
        ps         = pulse_size
        prof_gen   = prof_gen
        channels   = self.channels
        H0         = H0
        DH0        = DH0
        ippSec     = self.radarControllerHeaderObj.ippSeconds
        Fdoppler   = self.Fdoppler
        Hdoppler   = self.Hdoppler
        Adoppler   = self.Adoppler

        self.datablock = numpy.zeros([channels,prof_gen,Samples],dtype= numpy.complex64)
        for i in range(channels):
            for k in range(prof_gen):
                #-----------------------NOISE---------------
                Noise_r    = numpy.random.normal(DC_level,stdev,Samples)
                Noise_i    = numpy.random.normal(DC_level,stdev,Samples)
                Noise      = numpy.zeros(Samples,dtype=complex)
                Noise.real = Noise_r
                Noise.imag = Noise_i
                #-----------------------PULSOS--------------
                Pulso      = numpy.zeros(pulse_size,dtype=complex)
                Pulso.real =  pulses[k%num_codes]
                Pulso.imag =  pulses[k%num_codes]
                #--------------------- PULSES+NOISE----------
                InBuffer                    = numpy.zeros(Samples,dtype=complex)
                InBuffer[m_nR:m_nR+ps]      = Pulso
                InBuffer                    =  InBuffer+Noise
                #--------------------- ANGLE -------------------------------
                InBuffer.real[m_nR:m_nR+ps] = InBuffer.real[m_nR:m_nR+ps]*(math.cos( self.fAngle)*5)
                InBuffer.imag[m_nR:m_nR+ps] = InBuffer.imag[m_nR:m_nR+ps]*(math.sin( self.fAngle)*5)
                InBuffer=InBuffer
                self.datablock[i][k]= InBuffer

        #----------------DOPPLER SIGNAL...............................................
        time_vec   = numpy.linspace(0,(prof_gen-1)*ippSec,int(prof_gen))+self.nReadBlocks*ippSec*prof_gen+(self.nReadFiles-1)*ippSec*prof_gen
        fd         = Fdoppler #+(600.0/120)*self.nReadBlocks
        d_signal   = Adoppler*numpy.array(numpy.exp(1.0j*2.0*math.pi*fd*time_vec),dtype=numpy.complex64)
        #-------------Senal con ancho espectral--------------------
        if prof_gen%2==0:
            min = int(prof_gen/2.0-1.0)
            max = int(prof_gen/2.0)
        else:
            min = int(prof_gen/2.0)
            max = int(prof_gen/2.0)
        specw_sig  = numpy.linspace(-min,max,prof_gen)
        w          = 4
        A          = 20
        specw_sig   = specw_sig/w
        specw_sig   = numpy.sinc(specw_sig)
        specw_sig   =  A*numpy.array(specw_sig,dtype=numpy.complex64)
        #------------------ DATABLOCK + DOPPLER--------------------
        HD=int(Hdoppler/self.AcqDH_0)
        for  i in range(12):
            self.datablock[0,:,HD+i]=self.datablock[0,:,HD+i]+ d_signal# RESULT
        #------------------ DATABLOCK + DOPPLER*Sinc(x)--------------------
        HD=int(Hdoppler/self.AcqDH_0)
        HD=int(HD/2)
        for  i in range(12):
            self.datablock[0,:,HD+i]=self.datablock[0,:,HD+i]+ specw_sig*d_signal# RESULT

    def readBlock(self):

        self.jro_GenerateBlockOfData(Samples= self.samples,DC_level=self.DC_level,
                                     stdev=self.stdev,Reference= self.Reference,
                                     pulses = self.pulses,Num_Codes=self.Num_Codes,
                                     pulse_size=self.pulse_size,prof_gen=self.profiles,
                                     H0=self.H0,DH0=self.DH0)

        self.profileIndex   = 0
        self.flagIsNewFile  = 0
        self.flagIsNewBlock = 1
        self.nTotalBlocks  += 1
        self.nReadBlocks   += 1

        return 1


    def getData(self):
        if self.flagNoMoreFiles:
            self.dataOut.flagNodata = True
            return 0
        self.flagDiscontinuousBlock = 0
        self.flagIsNewBlock         = 0
        if self.__hasNotDataInBuffer():   # aqui es verdad
            if not(self.readNextBlock()): # return 1 y por eso el if not salta  a getBasic Header
                return 0
            self.getFirstHeader()         # atributo

        if not self.getByBlock:
            self.dataOut.flagDataAsBlock = False
            self.dataOut.data = self.datablock[:, self.profileIndex, :]
            self.dataOut.profileIndex = self.profileIndex
            self.profileIndex += 1
        else:
            pass
        self.dataOut.flagNoData = False
        self.getBasicHeader()
        self.dataOut.realtime = self.online
        return self.dataOut.data


    def setup(self,frequency=49.92e6,incIntFactor= 1, nFFTPoints = 0, FixPP_IncInt=1,FixRCP_IPP=1000,
                   FixPP_CohInt= 1,Tau_0= 250,AcqH0_0 = 70 ,AcqDH_0=1.25, Bauds= 32,
                   FixRCP_TXA = 40, FixRCP_TXB = 50, fAngle = 2.0*math.pi*(1/16),DC_level= 50,
                   stdev= 8,Num_Codes = 1 , Dyn_snCode = None, samples=200,
                   channels=2,Fdoppler=20,Hdoppler=36,Adoppler=500,
                   profilesPerBlock=300,dataBlocksPerFile=120,nTotalReadFiles=10000,
                   **kwargs):

        self.set_kwargs(**kwargs)
        self.nReadBlocks = 0
        self.nReadFiles  = 1
        print('------------------- [Opening file: ] ------------------------------',self.nReadFiles)

        tmp              = time.time()
        tmp_utc          = int(tmp)
        tmp_milisecond   = int((tmp-tmp_utc)*1000)
        print(" SETUP -basicHeaderObj.utc",datetime.datetime.utcfromtimestamp(tmp))
        if Dyn_snCode is None:
            Num_Codes=1
            Bauds    =1



        self.set_BH(utc= tmp_utc,miliSecond= tmp_milisecond,timeZone=300 )
        self.set_RCH( expType=0, nTx=150,ipp=FixRCP_IPP, txA=FixRCP_TXA, txB= FixRCP_TXB,
                 nWindows=1 , nHeights=samples, firstHeight=AcqH0_0, deltaHeight=AcqDH_0,
                 numTaus=1, line6Function=0, line5Function=0, fClock=None,
                 prePulseBefore=0, prePulseAfter=0,
                 codeType=0, nCode=Num_Codes, nBaud=32, code=Dyn_snCode,
                 flip1=0, flip2=0,Taus=Tau_0)

        self.set_PH(dtype=0, blockSize=0, profilesPerBlock=profilesPerBlock,
                      dataBlocksPerFile=dataBlocksPerFile, nWindows=1, processFlags=numpy.array([1024]), nCohInt=1,
                      nIncohInt=1, totalSpectra=0, nHeights=samples, firstHeight=AcqH0_0,
                      deltaHeight=AcqDH_0, samplesWin=samples, spectraComb=0, nCode=0,
                      code=0, nBaud=None, shif_fft=False, flag_dc=False,
                      flag_cspc=False, flag_decode=False, flag_deflip=False)

        self.set_SH(nSamples=samples, nProfiles=profilesPerBlock, nChannels=channels)

        self.readFirstHeader()

        self.frequency                      = frequency
        self.incIntFactor                   = incIntFactor
        self.nFFTPoints                     = nFFTPoints
        self.FixPP_IncInt                   = FixPP_IncInt
        self.FixRCP_IPP                     = FixRCP_IPP
        self.FixPP_CohInt                   = FixPP_CohInt
        self.Tau_0                          = Tau_0
        self.AcqH0_0                        = AcqH0_0
        self.H0                             = AcqH0_0
        self.AcqDH_0                        = AcqDH_0
        self.DH0                            = AcqDH_0
        self.Bauds                          = Bauds
        self.FixRCP_TXA                     = FixRCP_TXA
        self.FixRCP_TXB                     = FixRCP_TXB
        self.fAngle                         = fAngle
        self.DC_level                       = DC_level
        self.stdev                          = stdev
        self.Num_Codes                      = Num_Codes
        self.Dyn_snCode                     = Dyn_snCode
        self.samples                        = samples
        self.channels                       = channels
        self.profiles                       = None
        self.m_nReference                   = None
        self.Baudwidth                      = None
        self.Fdoppler                       = Fdoppler
        self.Hdoppler                       = Hdoppler
        self.Adoppler                       = Adoppler
        self.nTotalReadFiles                = int(nTotalReadFiles)

        print("IPP    ", self.FixRCP_IPP)
        print("Tau_0  ",self.Tau_0)
        print("AcqH0_0",self.AcqH0_0)
        print("samples,window ",self.samples)
        print("AcqDH_0",AcqDH_0)
        print("FixRCP_TXA",self.FixRCP_TXA)
        print("FixRCP_TXB",self.FixRCP_TXB)
        print("Dyn_snCode",Dyn_snCode)
        print("Fdoppler", Fdoppler)
        print("Hdoppler",Hdoppler)
        print("Vdopplermax",Fdoppler*(3.0e8/self.frequency)/2.0)
        print("nTotalReadFiles", nTotalReadFiles)

        self.init_acquisition()
        self.pulses,self.pulse_size=self.init_pulse(Num_Codes=self.Num_Codes,Bauds=self.Bauds,BaudWidth=self.BaudWidth,Dyn_snCode=Dyn_snCode)
        print(" [ END ] - SETUP metodo")
        return

    def run(self,**kwargs): # metodo propio
        if not(self.isConfig):
            self.setup(**kwargs)
            self.isConfig = True
        self.getData()
