Exemplo n.º 1
0
    def handleBcl(self, d):
        #log.msg("BCL")
        self.buffer.append(d)

        pkg = Paquete(self.buffer)
        if pkg.cs_ok():
            self.packageRecieved(pkg)
        else:
            self.checksumError(pkg)

        self.state = States.WAIT_SOF
Exemplo n.º 2
0
 def handleBcl(self, d):
     #log.msg("BCL")
     self.buffer.append(d)
     
     pkg = Paquete( self.buffer )
     if pkg.cs_ok():
         self.packageRecieved( pkg )
     else:
         self.checksumError( pkg )
         
     
     self.state = States.WAIT_SOF
Exemplo n.º 3
0
    def work(self):
        ''' El hilo del concentrador '''
        print "Inciando concentrador", self.concentrador,
        print " microcontroladores 485 nros:", map(
            lambda c: c.id_UC, self.concentrador.uc_set.all())

        if not self._connect():
            print "No se pudo conectar con %s:%s" % self.direccion()
            return

        # Seteamos el timeout
        self.socket.settimeout(1)
        # El automata se encarga de validar la integridad de los pauqetes
        automata = UCNetPacketDetector()
        while True:
            if GLOBAL_INTERRUPT_FLAG:
                return
            if not self.concentrador.uc_set.all().count():
                print "Sin controladores que pollear"
                return

            data = None
            tiempo_inicial = time.time()

            for uc in self.concentrador.uc_set.all():
                print "Poll UC ", uc.id_UC
                p = Paquete.crear_estados_y_eventos(0x01, uc.id_UC,
                                                    self.seq_num)
                print p
                try:
                    self.socket.send(p.octet_str())
                except SocketError, e:
                    print "Error en envio: %s" % e
                    return

                try:
                    data = self.socket.recv(255)
                except SocketError, e:
                    print "Error en recepcion %s" % e
                else:
                    # Si recibimos datos probamos armar el paquete
                    automata.feed(data)

                    # Con lo que sale del automata armamos un paquete
                    r = Paquete(lista_enteros=automata.get_pkg())
                    p.evaluar_respuesta(r)

                    print r
                    self.avanzar_seq_num()
Exemplo n.º 4
0
    def sendReqState(self, *largs):
        ''' Peticion de estados y eventos '''
        # Generacion del paquete, lo guardamos por si hay que retransmitir

        if self.state == States.HALTED or not self.transport.connected:
            log.msg('Deteniendo consulta')
            return
        # Hay un paquete que enviar
        if self._to_send_buffer:
            self.state = States.COMMAND_QUEUED
            pkg = self._to_send_buffer.pop(0)
            pkg['SEQ'] = self.seq
            log.msg('Comando: %s' % pkg)
            self.transport.write(pkg.octet_str())

            self.next_seq()
            reactor.callLater(self.co.poll_delay,
                              self.sendReqState)  #@UndefinedVariable
            log.msg('Envio del comando')
            return

        # TODO: Tomar de la confguracion del SCADA
        self.tries = 0
        self.current_pkg = Paquete.crear_estados_y_eventos(
            0x01, self.uc.id_UC, self.seq)
        # Enviamos el paquete al medio
        self.transport.write(self.current_pkg.octet_str())
        # Cambio de estado
        self.scada_state = States.STATE_REQ_SENT
        # Preparamos el temeout
        log.msg('Poll ---> %.2d%.2d' % (self.co.id_CO, self.uc.id_UC))
        self.timeout_defer = reactor.callLater(
            self.co.t_out, self.timeoutElapsed)  #@UndefinedVariable
Exemplo n.º 5
0
 def sendReqState(self, *largs):
     ''' Peticion de estados y eventos '''
     # Generacion del paquete, lo guardamos por si hay que retransmitir
     
     if self.state == States.HALTED or not self.transport.connected:
         log.msg('Deteniendo consulta')
         return
     # Hay un paquete que enviar
     if self._to_send_buffer:
         self.state = States.COMMAND_QUEUED
         pkg = self._to_send_buffer.pop(0)
         pkg['SEQ'] = self.seq
         log.msg('Comando: %s' % pkg )
         self.transport.write( pkg.octet_str() )
         
         self.next_seq()
         reactor.callLater( self.co.poll_delay, self.sendReqState ) #@UndefinedVariable
         log.msg('Envio del comando')
         return
     
     # TODO: Tomar de la confguracion del SCADA
     self.tries = 0
     self.current_pkg = Paquete.crear_estados_y_eventos(0x01, 
                                                        self.uc.id_UC,
                                                        self.seq)
     # Enviamos el paquete al medio
     self.transport.write(self.current_pkg.octet_str())
     # Cambio de estado
     self.scada_state = States.STATE_REQ_SENT
     # Preparamos el temeout
     log.msg('Poll ---> %.2d%.2d' % (self.co.id_CO, self.uc.id_UC))
     self.timeout_defer = reactor.callLater(self.co.t_out, self.timeoutElapsed) #@UndefinedVariable
Exemplo n.º 6
0
 def on_pushLeerEE_pressed(self):
     pagina = self.spinPagina.value()
     direccion = self.spinDireccion.value()
     cantidad = self.spinCantidad.value()
     pkg = Paquete.crear_lectura_eeprom(self.origen, self.destino, self.secuencia, 
                                     pagina, direccion, cantidad)
     self.entrada_hexa()
     self.line_envio.setText(pkg.hex_dump())
Exemplo n.º 7
0
 def on_pushEnviarAppString_pressed(self):
     lista = [
         int(x, 16) for x in str(self.lineAppString.text()).split()
         if len(x)
     ]
     pkg = Paquete.crear_paquete_custom(self.origen, self.destino,
                                        self.secuencia, lista)
     self.entrada_hexa()
     self.line_envio.setText(pkg.hex_dump())
Exemplo n.º 8
0
 def on_pushLeerEE_pressed(self):
     pagina = self.spinPagina.value()
     direccion = self.spinDireccion.value()
     cantidad = self.spinCantidad.value()
     pkg = Paquete.crear_lectura_eeprom(self.origen, self.destino,
                                        self.secuencia, pagina, direccion,
                                        cantidad)
     self.entrada_hexa()
     self.line_envio.setText(pkg.hex_dump())
Exemplo n.º 9
0
 def on_pushControl_pressed(self):
     puerto = self.spinPuerto.value()
     bit = self.spinBit.value()
     estado = self.radioBitUno.isChecked() and 1 or 0
     indirecto = self.checkIndirecto.isChecked()
     pkg = Paquete.crear_control(self.origen, self.destino, self.secuencia, 
                                 puerto, bit, estado, 
                                 es_comando_indirecto = indirecto)
     self.entrada_hexa()
     self.line_envio.setText(pkg.hex_dump())
Exemplo n.º 10
0
 def on_pushControl_pressed(self):
     puerto = self.spinPuerto.value()
     bit = self.spinBit.value()
     estado = self.radioBitUno.isChecked() and 1 or 0
     indirecto = self.checkIndirecto.isChecked()
     pkg = Paquete.crear_control(self.origen,
                                 self.destino,
                                 self.secuencia,
                                 puerto,
                                 bit,
                                 estado,
                                 es_comando_indirecto=indirecto)
     self.entrada_hexa()
     self.line_envio.setText(pkg.hex_dump())
Exemplo n.º 11
0
 def work(self):
     ''' El hilo del concentrador '''
     print "Inciando concentrador", self.concentrador,
     print " microcontroladores 485 nros:", map(lambda c: c.id_UC, self.concentrador.uc_set.all())
     
     if not self._connect():
         print "No se pudo conectar con %s:%s" % self.direccion()
         return
     
     # Seteamos el timeout
     self.socket.settimeout(1)
     # El automata se encarga de validar la integridad de los pauqetes
     automata = UCNetPacketDetector()
     while True:
         if GLOBAL_INTERRUPT_FLAG:
             return
         if not self.concentrador.uc_set.all().count():
             print "Sin controladores que pollear"
             return
         
         data = None
         tiempo_inicial = time.time()
         
         for uc in self.concentrador.uc_set.all():
             print "Poll UC ", uc.id_UC
             p = Paquete.crear_estados_y_eventos(0x01, uc.id_UC, self.seq_num)
             print p
             try:
                 self.socket.send(p.octet_str())
             except SocketError, e:
                 print "Error en envio: %s" % e
                 return
                 
             try:
                 data = self.socket.recv(255)
             except SocketError, e:
                 print "Error en recepcion %s" % e
             else:
                 # Si recibimos datos probamos armar el paquete
                 automata.feed(data)
             
                 # Con lo que sale del automata armamos un paquete
                 r = Paquete(lista_enteros = automata.get_pkg())
                 p.evaluar_respuesta(r)
                 
             
                 print r
                 self.avanzar_seq_num()
Exemplo n.º 12
0
 def on_pushPuestaEnHora_pressed(self):
     #QtGui.QMessageBox.information(self, 'hola', 'Hola')
     pkg = Paquete.crear_puesta_en_hora(self.origen, self.destino,
                                        self.secuencia)
     self.entrada_hexa()
     self.line_envio.setText(pkg.hex_dump())
Exemplo n.º 13
0
 def on_pushSendReqMorEv_pressed(self):
     pkg = Paquete.crear_mas_eventos(self.origen, self.destino,
                                     self.secuencia)
     self.entrada_hexa()
     self.line_envio.setText(pkg.hex_dump())
Exemplo n.º 14
0
 def on_pushPuestaEnHora_pressed(self):
     #QtGui.QMessageBox.information(self, 'hola', 'Hola')
     pkg = Paquete.crear_puesta_en_hora(self.origen, self.destino, 
                                        self.secuencia)
     self.entrada_hexa()
     self.line_envio.setText(pkg.hex_dump())
Exemplo n.º 15
0
 def on_pushSendReqMorEv_pressed(self):
     pkg = Paquete.crear_mas_eventos(self.origen, self.destino, 
                                         self.secuencia)
     self.entrada_hexa()
     self.line_envio.setText(pkg.hex_dump())
Exemplo n.º 16
0
        0x0C,  # PORTA
        0xfe,  # PORTB
        0xac,  # PORTC
        2,  # Cantidad de AI (Analog Input)
        0x03,  # AI0H  
        0xFF,  # AI0L
        0x02,  # AI1H
        0x00,  # AI1L
        0,  # Cantidad de evntos (por ahora sin eventos, poruqe son de 7 bytes
    ]
    datos[1] = len(datos) + 2  # Preagregamos el checksum
    datos += make_cs_bigendian(datos)  # Concatenamos el checksum
    logger.info(' '.join([('%.2x' % i).upper() for i in datos]))
    datos_cadena = ''.join([chr(i) for i in datos])
    assert len(datos) == len(datos_cadena), "Error en la conversion de cadena"
    while 1:
        trama = sock_con.recv(255)
        sock_con.send(datos_cadena)
        q = Paquete.from_octet_stream(trama)
        logger.info(q)
    return 0


if __name__ == '__main__':
    try:
        main()
    # Cuando recibe una interrupcion de teclado
    except KeyboardInterrupt:
        TERMINAR = True
        print "Saliendo del programa"
Exemplo n.º 17
0
             0xfe,  # PORTB
             0xac,  # PORTC
             2,     # Cantidad de AI (Analog Input)
             0x03,  # AI0H  
             0xFF,  # AI0L
             0x02,  # AI1H
             0x00,  # AI1L
             0,     # Cantidad de evntos (por ahora sin eventos, poruqe son de 7 bytes
             ]
    datos[1] = len(datos) + 2 # Preagregamos el checksum
    datos += make_cs_bigendian(datos) # Concatenamos el checksum
    logger.info(' '.join( [('%.2x' % i).upper() for i in datos]))
    datos_cadena = ''.join([chr(i) for i in datos])
    assert len(datos) == len(datos_cadena), "Error en la conversion de cadena"
    while 1:
        trama = sock_con.recv(255);
        sock_con.send(datos_cadena)
        q = Paquete.from_octet_stream(trama)
        logger.info(q)
    return 0
        
   

if __name__ == '__main__':
    try:
        main()
    # Cuando recibe una interrupcion de teclado
    except KeyboardInterrupt:
        TERMINAR = True
        print "Saliendo del programa"
        
Exemplo n.º 18
0
 def on_pushEnviarAppString_pressed(self):
     lista = [ int(x, 16) for x in str(self.lineAppString.text()).split() if len(x)]
     pkg = Paquete.crear_paquete_custom(self.origen, self.destino, 
                                        self.secuencia, lista)
     self.entrada_hexa()
     self.line_envio.setText(pkg.hex_dump())