Exemplo n.º 1
0
    def send(self):
        for i in range(len(self.ports)):
            if len(self.port_information[i]) == 0:
                self.port_origin[i] = ""
                self.port_mac[i] = ""
                self.state[i] = 0
                continue

            elif self.state[i] == 1:
                continue
            empty = 0
            sent = False
            find = False
            for j in range(len(self.ports)):
                if self.port_mac[i] in self.macs[j]:
                    find = True
                    wire = self.consultDevice.fire(
                        self.consultDeviceMap.fire(
                            get_device_port(self.ports[j])[0]))
                    if wire is None:
                        self.macs[j].remove(self.port_mac[i])
                        continue
                    if self.cable_send[j]:
                        if wire.red is None:
                            wire.red = self.port_information[i][0]
                            sent = True
                    else:
                        if wire.blue is None:
                            wire.blue = self.port_information[i][0]
                            sent = True
                    if sent:
                        self.resend_bit(wire, i, j)

            if not find:
                for j in range(len(self.ports)):
                    if self.ports[j] == "" or i == j:
                        empty += 1
                        continue
                    wire = self.consultDevice.fire(
                        self.consultDeviceMap.fire(
                            get_device_port(self.ports[j])[0]))
                    if wire is None:
                        continue
                    if self.cable_send[j]:
                        if wire.red is None:
                            wire.red = self.port_information[i][0]
                            sent = True
                    else:
                        if wire.blue is None:
                            wire.blue = self.port_information[i][0]
                            sent = True
                    if sent:
                        self.resend_bit(wire, i, j)

            if sent or empty == len(self.ports):
                self.time_sending[i] -= 1
            if (empty == len(self.ports)
                    or sent) and self.time_sending[i] == 0:
                self.port_information[i].popleft()
                self.time_sending[i] = self.askSignalTime.fire()
Exemplo n.º 2
0
    def _send(self, bit):
        if self.ports[0] is "":
            self.report_send_ok(bit)
            return True
        wire = self.consultDevice.fire(
            self.consultDeviceMap.fire(get_device_port(self.ports[0])[0]))

        if self.cable_send[0]:
            wire.red = bit
        else:
            wire.blue = bit

        wd = self.consultDevice.fire(
            self.consultDeviceMap.fire(
                get_device_port(wire.ports[1])[0] if wire.ports[0] ==
                self.name + "_" +
                str(1) else get_device_port(wire.ports[0])[0]))
        if isinstance(wd, Resender):
            wdp = wire.name + "_" + str(2) if wire.ports[
                0] == self.name + "_" + str(1) else wire.name + "_" + str(1)
            if wd.resend(bit, wdp) is "COLLISION":
                self.report_collision(bit)
                return False
            else:
                wd.resend(bit, wdp, True)
                wd.read_value[wd.ports.index(wdp)] = bit
        elif type(wd) is Host:
            wd.read_value[0] = bit
        self.report_send_ok(bit)
        return True
Exemplo n.º 3
0
    def find_root(self, port_name):
        device_name,port = get_device_port(port_name)
        port=int(port)-1
        component = Storage_Device_Singleton.instance().get_device_with(device_name)
        while True:
            if isinstance(component,Host):
               return component
            elif isinstance(component,Wire):
                port_name=component.ports[1]  if port==0 else component.ports[0]
            else:
                port_name=component.internal_port_connection[port]
            device_name,port=get_device_port(port_name)
            port=int(port)-1
            component = Storage_Device_Singleton.instance().get_device_with(device_name)

               
Exemplo n.º 4
0
 def can_send(self, i):
     for j in range(len(self.ports)):
         if self.ports[j] == "" or i == j:
             continue
         wire = self.consultDevice.fire(
             self.consultDeviceMap.fire(get_device_port(self.ports[j])[0]))
         if self.cable_send[j]:
             if not wire.red is None:
                 return False
         else:
             if not wire.blue is None:
                 return False
     return True
Exemplo n.º 5
0
 def resend_bit(self, wire, i, j):
     bit = self.port_information[i][0]
     wd = self.consultDevice.fire(
         self.consultDeviceMap.fire(
             get_device_port(wire.ports[1])[0] if wire.ports[0] ==
             self.name + "_" +
             str(j + 1) else get_device_port(wire.ports[0])[0]))
     # si el dispositivo es un resender entonces dile que reenvie
     if isinstance(wd, Resender):
         # dame el puerto del cable que esta conectado al Resender
         wdp = wire.name + "_" + str(2) if wire.ports[
             0] == self.name + "_" + str(j +
                                         1) else wire.name + "_" + str(1)
         # revisa si el resender da colision
         if wd.resend(bit, wdp) is "COLLISION":
             self.report_collision()
             return "COLLISION"
         else:
             # si no hubo colision entonces pon el valor
             wd.resend(bit, wdp, True)
             wd.read_value[wd.ports.index(wdp)] = bit
     elif type(wd) is Host:
         wd.read_value[0] = bit
Exemplo n.º 6
0
    def execute(self, instruction):
        index_1=Storage_Device_Singleton.instance().get_index(instruction.device_1)
        device = Storage_Device_Singleton.instance().get_device_with(instruction.device_1)
        if device.ports[instruction.port_1]=='':
            print('Unconnected port. Ignored action')
        else:
            name_wire, port_wire = get_device_port(device.ports[instruction.port_1])
            port_wire = int(port_wire) - 1

            wire =  Storage_Device_Singleton.instance().get_device_with(name_wire)

            name_2, port_2 = get_device_port(wire.ports[1-port_wire])
            port_2 = int(port_2) - 1

            device.ports[instruction.port_1] = ""
            device_2 = Storage_Device_Singleton.instance().get_device_with(name_2)
            device_2.ports[port_2] = ""

            if isinstance(device, Switch):
                device.clean_port(port_wire)
            if isinstance(device_2, Switch):
                device_2.clean_port(port_2)
        return True
Exemplo n.º 7
0
    def resend(self, bit, port_name, write=False):
        if write:
            self.read_value[self.ports.index(port_name)] = bit
        # lista de puertos por donde reenvio
        list_port = []

        # puerto del hub por donde recibio la info
        from_value = self.name + "_" + str(self.ports.index(port_name) + 1)

        # si hay que escribir el valor en el txt
        if write:
            self.report_receive_ok(bit, from_value)

        # por cada puerto reenvia
        for i in range(len(self.ports)):
            # toma el valor del puerto (esto es el puerto de un cable que esta conectado a ti)
            port = self.ports[i]

            # si el puerto es vacio o el puerto es por el mismo que recibes
            if port == "" or port == port_name:
                continue

            # dame el cable que esta conectado en el puerto
            wire = self.consultDevice.fire(
                self.consultDeviceMap.fire(get_device_port(port)[0]))

            # si envias por el rojo
            if self.cable_send[i]:
                # si el rojo no esta vacio entonces hay colision
                if not wire.red is None:
                    self.report_collision()
                    return "COLLISION"
                # si hay que escribir entonces pon el valor en el cable rojo
                if write:
                    wire.red = bit
            else:
                # revisa si hay colision en el azul
                if not wire.blue is None:
                    self.report_collision()
                    return "COLLISION"
                # si hay que escribir entonces pon el valor en el cable azul
                if write:
                    wire.blue = bit

            # agrega este indice a la lista
            list_port.append(i)

            # dispositivo con el que esta conectado a traves del cable
            wd = self.consultDevice.fire(
                self.consultDeviceMap.fire(
                    get_device_port(wire.ports[1])[0] if wire.ports[0] ==
                    self.name + "_" +
                    str(i + 1) else get_device_port(wire.ports[0])[0]))
            # si el dispositivo es un resender entonces dile que reenvie
            if isinstance(wd, Resender):
                # dame el puerto del cable que esta conectado al Resender
                wdp = wire.name + "_" + str(
                    2) if wire.ports[0] == self.name + "_" + str(
                        i + 1) else wire.name + "_" + str(1)
                # revisa si el resender da colision
                if wd.resend(bit, wdp) is "COLLISION":
                    self.report_collision()
                    return "COLLISION"
                else:
                    # si no hubo colision entonces pon el valor
                    wd.resend(bit, wdp, True)
                    wd.read_value[wd.ports.index(wdp)] = bit
            elif type(wd) is Host:
                wd.read_value[0] = bit
        # reporta que renviaste si tienes que escribir
        if write:
            self.report_resend(bit, from_value)
        return list_port
Exemplo n.º 8
0
    def read(self, report):
        if self.ports[0] == "":
            return
        wire = self.consultDevice.fire(
            self.consultDeviceMap.fire(get_device_port(self.ports[0])[0]))
        #rd = wire.red if not self.cable_send[0] else wire.blue
        rd = self.read_value[0]
        if report:
            self.report_receive_ok(rd, f"{self.name}_1")

            if self.receiving == 0 and rd == INIT_FRAME_BIT:
                self.transition_receive()
            elif self.receiving == 1:
                if rd == None:
                    return
                elif rd == INIT_FRAME_BIT:
                    self.clean_receive()
                    self.receiving = 1
                    return
                if self.receive_time == 0:
                    self.receive_MAC_1 += str(rd)
                if self.check_size(self.receive_MAC_1, 16):
                    if self.receive_MAC_1 == self.MAC or self.receive_MAC_1 == "1" * 16:
                        self.transition_receive()
                    else:
                        self.receiving = 0
                        self.clean_receive()
            elif self.receiving == 2:
                if rd == None:
                    return
                elif rd == INIT_FRAME_BIT:
                    self.clean_receive()
                    self.receiving = 1
                    return
                if self.receive_time == 0:
                    self.receive_MAC_2 += str(rd)
                if self.check_size(self.receive_MAC_2, 16):
                    self.transition_receive()
            elif self.receiving == 3:
                if rd == None:
                    return
                elif rd == INIT_FRAME_BIT:
                    self.clean_receive()
                    self.receiving = 1
                    return
                if self.receive_time == 0:
                    self.receive_size += str(rd)
                if self.check_size(self.receive_size, 8):
                    self.transition_receive()
            elif self.receiving == 4:
                if rd == None:
                    return
                elif rd == INIT_FRAME_BIT:
                    self.clean_receive()
                    self.receiving = 1
                    return
                if self.receive_time == 0:
                    self.receive_off += str(rd)
                if self.check_size(self.receive_off, 8):
                    self.transition_receive()
            elif self.receiving == 5:
                if rd == None:
                    return
                elif rd == INIT_FRAME_BIT:
                    self.clean_receive()
                    self.receiving = 1
                    return
                if self.receive_time == 0:
                    self.receive_data += str(rd)
                if self.check_size(self.receive_data,
                                   8 * int(self.receive_size, 2)):
                    self.transition_receive()
            elif self.receiving == 6:
                if rd == None:
                    return
                elif rd == INIT_FRAME_BIT:
                    self.clean_receive()
                    self.receiving = 1
                    return
                if self.receive_time == 0:
                    self.receive_detect += str(rd)
                if self.check_size(self.receive_detect,
                                   8 * int(self.receive_off, 2)):
                    detect = str()
                    if not self.detection.check("".join([
                            INIT_FRAME_BIT, self.receive_MAC_1,
                            self.receive_MAC_2, self.receive_size,
                            self.receive_off, self.receive_data,
                            self.receive_detect
                    ])):
                        detect += "ERROR"
                    self.data_logger.write(
                        f"{bin_hex(self.receive_MAC_2)} {bin_hex(self.receive_data)} {detect}"
                    )
                    self.clean_receive()

            if self.receive_time < self.askSignalTime.fire() - 1:
                self.receive_time += 1
            else:
                self.receive_time = 0