Exemple #1
0
    def __init__(self, spi_liststore_lock):
        gtk.gdk.threads_init() # init the gdk threads
        threading.Thread.__init__(self)

        self.spi_liststore_lock = spi_liststore_lock

        # a bit of spaghetti set up
        emulator_parts.pfio = pfio
        emulator_parts.rpi_emulator = self
        self.spi_visualiser_section = emulator_parts.SpiVisualiserFrame(self)
        global pfio_connect
        try:
            pfio.init()
            pfio_connect = True
        except pfio.InitError:
            print "Could not connect to the SPI module (check privileges). Starting emulator assuming that the PiFace is not connected."
            pfio_connect = False
            emulator_parts.pfio = None

        self.emu_window = gtk.Window()
        self.emu_window.connect("delete-event", gtk.main_quit)
        self.emu_window.set_title(WINDOW_TITLE)

        # emu screen
        self.emu_screen = emulator_parts.EmulatorScreen(EMU_WIDTH, EMU_HEIGHT, EMU_SPEED)
        self.emu_screen.show()

        # board connected msg
        if pfio_connect:
            msg = "Pi Face detected!"
        else:
            msg = "Pi Face not detected"
        self.board_con_msg = gtk.Label(msg)
        self.board_con_msg.show()

        if pfio_connect:
            # keep inputs updated
            self.update_input_check = gtk.CheckButton("Keep inputs updated")
            self.update_input_check.show()
            self.update_interval = gtk.Entry(5)
            self.update_interval.set_width_chars(5)
            self.update_interval.set_text("500")
            self.update_interval.show()
            update_interval_label = gtk.Label("ms interval")
            update_interval_label.show()

            self.update_input_check.connect("clicked", self.update_inputs)

            update_inputs_containter = gtk.HBox(False)
            update_inputs_containter.pack_start(self.update_input_check)
            update_inputs_containter.pack_start(self.update_interval, False, False)
            update_inputs_containter.pack_start(update_interval_label, False, False)
            update_inputs_containter.show()

            # spi visualiser checkbox
            self.spi_vis_check = gtk.CheckButton("SPI Visualiser")
            self.spi_vis_check.connect("clicked", self.toggle_spi_visualiser)
            self.spi_vis_check.show()

            # enable pullups checkbox
            self.en_pull_check = gtk.CheckButton("Enable pullups")
            self.en_pull_check.set_active(True)
            self.en_pull_check.connect("clicked", self.toggle_en_pullups)
            self.en_pull_check.show()

        # output override section
        self.output_override_section = \
                emulator_parts.OutputOverrideSection(self.emu_screen.output_pins)
        self.output_override_section.show()

        # spi visualiser
        if pfio_connect:
            #spi_visualiser_section = emulator_parts.SpiVisualiserFrame()
            self.spi_visualiser_section.set_size_request(50, 200)
            self.spi_visualiser_section.set_border_width(DEFAULT_SPACING)
            #self.spi_visualiser_section.show()
            self.spi_visualiser_section.hide()

        # vertically pack together the emu_screen and the board connected msg
        container0 = gtk.VBox(homogeneous=False, spacing=DEFAULT_SPACING)
        container0.pack_start(self.emu_screen)
        container0.pack_start(self.board_con_msg)

        if pfio_connect:
            container0.pack_start(update_inputs_containter)
            container0.pack_start(self.spi_vis_check)
            container0.pack_start(self.en_pull_check)

        container0.show()

        # horizontally pack together the emu screen+msg and the button overide
        container1 = gtk.HBox(homogeneous=True, spacing=DEFAULT_SPACING)
        container1.pack_start(container0)
        container1.pack_start(self.output_override_section)
        container1.set_border_width(DEFAULT_SPACING)
        container1.show()
        top_containter = container1

        if pfio_connect:
            # now, verticaly pack that container and the spi visualiser
            container2 = gtk.VBox(homogeneous=True, spacing=DEFAULT_SPACING)
            container2.pack_start(child=container1, expand=False, fill=False, padding=0)
            container2.pack_start(self.spi_visualiser_section)
            container2.show()
            top_containter = container2

        self.emu_window.add(top_containter)
        self.emu_window.present()

        self.input_updater = None
Exemple #2
0
 def init_pfio(self, widget, data=None):
     pfio.init()
Exemple #3
0
 def init_pfio(self, widget, data=None):
     pfio.init()
Exemple #4
0
def start_pfio_server(callback=None, verbose=False, port=DEFAULT_PORT):
    """Starts listening for pfio packets over the network"""
    pfio.init()
    try:
        # this returns the loopback ip on the RPi :-(
        #hostname = socket.gethostname()

        ###################################################
        # this is pretty hacky, if anyone can find a better
        # solution, then please change this!
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(("8.8.8.8", 80)) # try to connect to google's dns
        hostname = s.getsockname()[0] # get this device's hostname
        s.close()
        # blergh, nasty stuff
        ###################################################

        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.bind((hostname, port))

    except socket.error as e:
        print "There was an error setting up the server socket!"
        print e
        return

    else:
        if verbose:
            print "Listening at %s on port %d" % (hostname, port)

    while True:
        # get the packet
        packet, sender = sock.recvfrom(BUFFER_SIZE)
        if verbose:
            print "Recieved packet from", sender
        # make it something sensible
        packet = PfionPacket().from_network(packet)

        if packet.command == WRITE_OUT_CMD:
            pfio.write_output(packet.bit_pattern)
            p = PfionPacket(WRITE_OUT_ACK)
            sock.sendto(p.for_network(), sender)

        elif packet.command == READ_OUT_CMD:
            output_bitp = pfio.read_output()
            p = PfionPacket(READ_OUT_ACK)
            p.bit_pattern = output_bitp
            sock.sendto(p.for_network(), sender)

        elif packet.command == READ_IN_CMD:
            input_bitp = pfio.read_input()
            p = PfionPacket(READ_IN_ACK)
            p.bit_pattern = input_bitp
            sock.sendto(p.for_network(), sender)

        elif packet.command == DIGITAL_WRITE_CMD:
            pfio.digital_write(packet.pin_number, packet.pin_value)
            p = PfionPacket(DIGITAL_WRITE_ACK)
            sock.sendto(p.for_network(), sender)

        elif packet.command ==  DIGITAL_READ_CMD:
            pin_value = pfio.digital_read(packet.pin_number)
            p = PfionPacket(DIGITAL_READ_ACK)
            p.pin_number = packet.pin_number
            p.pin_value  = pin_value
            sock.sendto(p.for_network(), sender)

        elif callback != None:
            callback(packet, sender)

        elif verbose:
            print "Unkown packet command (%d). Ignoring." % packet.command
Exemple #5
0
def start_pfio_server(callback=None, verbose=False, port=DEFAULT_PORT):
    """Starts listening for pfio packets over the network"""
    pfio.init()
    try:
        # this returns the loopback ip on the RPi :-(
        #hostname = socket.gethostname()

        ###################################################
        # this is pretty hacky, if anyone can find a better
        # solution, then please change this!
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(("8.8.8.8", 80))  # try to connect to google's dns
        hostname = s.getsockname()[0]  # get this device's hostname
        s.close()
        # blergh, nasty stuff
        ###################################################

        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.bind((hostname, port))

    except socket.error as e:
        print "There was an error setting up the server socket!"
        print e
        return

    else:
        if verbose:
            print "Listening at %s on port %d" % (hostname, port)

    while True:
        # get the packet
        packet, sender = sock.recvfrom(BUFFER_SIZE)
        if verbose:
            print "Recieved packet from", sender
        # make it something sensible
        packet = PfionPacket().from_network(packet)

        if packet.command == WRITE_OUT_CMD:
            pfio.write_output(packet.bit_pattern)
            p = PfionPacket(WRITE_OUT_ACK)
            sock.sendto(p.for_network(), sender)

        elif packet.command == READ_OUT_CMD:
            output_bitp = pfio.read_output()
            p = PfionPacket(READ_OUT_ACK)
            p.bit_pattern = output_bitp
            sock.sendto(p.for_network(), sender)

        elif packet.command == READ_IN_CMD:
            input_bitp = pfio.read_input()
            p = PfionPacket(READ_IN_ACK)
            p.bit_pattern = input_bitp
            sock.sendto(p.for_network(), sender)

        elif packet.command == DIGITAL_WRITE_CMD:
            pfio.digital_write(packet.pin_number, packet.pin_value)
            p = PfionPacket(DIGITAL_WRITE_ACK)
            sock.sendto(p.for_network(), sender)

        elif packet.command == DIGITAL_READ_CMD:
            pin_value = pfio.digital_read(packet.pin_number)
            p = PfionPacket(DIGITAL_READ_ACK)
            p.pin_number = packet.pin_number
            p.pin_value = pin_value
            sock.sendto(p.for_network(), sender)

        elif callback != None:
            callback(packet, sender)

        elif verbose:
            print "Unkown packet command (%d). Ignoring." % packet.command