def __init__(self):
        # Various
        self.fr = FreeRunner()
        self.network_index = -1

        # GTK building
        builder = gtk.Builder()
        builder.add_from_file("../data/freerunner-utility.xml")
        builder.connect_signals(self)
        self.pwr_toggle     = builder.get_object("pwr_toggle")
        self.usb_toggle     = builder.get_object("usb_toggle")
        self.op_in_progress = builder.get_object("op_in_progress")
        self.connect_button = builder.get_object("connect")
        self.window         = builder.get_object("window")

        # Button extension and initialisation
        self.usb_toggle.fr_attribute = "usb_mode"
        self.usb_toggle.alternatives = (('I am a DEVICE', 'device'), ('I am a HOST', 'host'))
        self.usb_toggle.set_active(self.fr.usb_mode.strip() == 'host')
        self.toggler(self.usb_toggle)
        self.pwr_toggle.fr_attribute = "pwr_mode"
        self.pwr_toggle.alternatives = (('I am GIVING energy to USB', 1), ('I am TAKING energy via USB', 0))
        self.pwr_toggle.set_active(self.fr.pwr_mode.strip() == '0')
        self.toggler(self.pwr_toggle)

        # Showtime!
        self.window.maximize()
        self.window.show()
Esempio n. 2
0
 def __init__(self):
     self.fr = FreeRunner()
     self.boat = boat.FreeBoat(freerunner=self.fr)
     self.gui_file = "../data/freerunner-gui.xml"
     super(FreeRunnerControlPanel, self).__init__()
     # Collect all buttons in order to be able to gray them out later on
     self.all_buttons=[]
     self.all_buttons.append(self.builder.get_object("log_data"))
     self.all_buttons.append(self.builder.get_object("wireless_bridge"))
     self.all_buttons.append(self.builder.get_object("wireless_watchdog"))
     self.all_buttons.append(self.builder.get_object("use_accelerometer"))
     self.all_buttons.append(self.builder.get_object("quit_button"))
     self.all_buttons.append(self.builder.get_object("run_button"))
     self.all_buttons.append(self.builder.get_object("use_gps"))
     self.all_buttons.append(self.builder.get_object("battery_info"))
     # The following bit replace the placeholder drawing area with the scene
     tmp = self.builder.get_object("drawingarea")
     self.scene = LockScreen(self._set_button_sensitivity)
     tmp.destroy()
     box = self.builder.get_object("frame1")
     box.add(self.scene)
     # Each subsystem has its name, name in self.active_system
     # set indicates the system is active. self.active_systems is passed
     # to the instance of FreeRunner. All systems are initially OFF
     self.active_systems = set()
     self.run_mode = False
     self.logging_mode = False
     self.wifi = None
     self.watchdog = False
     gobject.timeout_add(10, self.loop)
     self.window.maximize()
     self.window.show_all()
class FreeRunnerControlPanel(object):

    '''
    Provide the visual environment for interacting with the boat.
    '''

    def __init__(self):
        # Various
        self.fr = FreeRunner()
        self.network_index = -1

        # GTK building
        builder = gtk.Builder()
        builder.add_from_file("../data/freerunner-utility.xml")
        builder.connect_signals(self)
        self.pwr_toggle     = builder.get_object("pwr_toggle")
        self.usb_toggle     = builder.get_object("usb_toggle")
        self.op_in_progress = builder.get_object("op_in_progress")
        self.connect_button = builder.get_object("connect")
        self.window         = builder.get_object("window")

        # Button extension and initialisation
        self.usb_toggle.fr_attribute = "usb_mode"
        self.usb_toggle.alternatives = (('I am a DEVICE', 'device'), ('I am a HOST', 'host'))
        self.usb_toggle.set_active(self.fr.usb_mode.strip() == 'host')
        self.toggler(self.usb_toggle)
        self.pwr_toggle.fr_attribute = "pwr_mode"
        self.pwr_toggle.alternatives = (('I am GIVING energy to USB', 1), ('I am TAKING energy via USB', 0))
        self.pwr_toggle.set_active(self.fr.pwr_mode.strip() == '0')
        self.toggler(self.pwr_toggle)

        # Showtime!
        self.window.maximize()
        self.window.show()

    def toggler(self, widget):
        '''
        Helper method that connects a toggle button to a FreeRunner propriety

        each toggable widget has a "fr_attribute" and two couples of
        button_label/attr_value, the first of which refers to the
        "button up" state.
        '''
        label, value = widget.alternatives[widget.get_active()]
        setattr(self.fr, widget.fr_attribute, value)
        widget.set_label(label)

    def throbber(self, func):
        '''
        Helper method that execute a routine while displaying a "throbber"
        '''
        self.op_in_progress.show_all()
        # make sure the throbbing starts now
        while gtk.events_pending():
            gtk.main_iteration()
        try:
            func()
        finally:
            self.op_in_progress.hide()

    def on_usb_toggle_toggled(self, widget):
        self.toggler(widget)

    def on_power_toggle_toggled(self, widget):
        self.toggler(widget)

    def on_select_wifi_clicked(self, widget):
        self.network_index = (self.network_index + 1) % len(self.fr.configured_networks)
        network = self.fr.configured_networks[self.network_index]
        widget.set_label("Connect to " + network +
                         "\n(click to change)")
        self.connect_button.set_sensitive(True)

    def on_connect_clicked(self, widget):
        self.fr.connect_to_network(self.fr.configured_networks[self.network_index])
        widget.set_sensitive(False)

    def on_window_destroy(self, widget, data=None):
        gtk.main_quit()

    def on_quit_clicked(self, widget):
        gtk.main_quit()
Esempio n. 4
0
class FreeRunnerControlPanel(GeneralControlPanel):

    def __init__(self):
        self.fr = FreeRunner()
        self.boat = boat.FreeBoat(freerunner=self.fr)
        self.gui_file = "../data/freerunner-gui.xml"
        super(FreeRunnerControlPanel, self).__init__()
        # Collect all buttons in order to be able to gray them out later on
        self.all_buttons=[]
        self.all_buttons.append(self.builder.get_object("log_data"))
        self.all_buttons.append(self.builder.get_object("wireless_bridge"))
        self.all_buttons.append(self.builder.get_object("wireless_watchdog"))
        self.all_buttons.append(self.builder.get_object("use_accelerometer"))
        self.all_buttons.append(self.builder.get_object("quit_button"))
        self.all_buttons.append(self.builder.get_object("run_button"))
        self.all_buttons.append(self.builder.get_object("use_gps"))
        self.all_buttons.append(self.builder.get_object("battery_info"))
        # The following bit replace the placeholder drawing area with the scene
        tmp = self.builder.get_object("drawingarea")
        self.scene = LockScreen(self._set_button_sensitivity)
        tmp.destroy()
        box = self.builder.get_object("frame1")
        box.add(self.scene)
        # Each subsystem has its name, name in self.active_system
        # set indicates the system is active. self.active_systems is passed
        # to the instance of FreeRunner. All systems are initially OFF
        self.active_systems = set()
        self.run_mode = False
        self.logging_mode = False
        self.wifi = None
        self.watchdog = False
        gobject.timeout_add(10, self.loop)
        self.window.maximize()
        self.window.show_all()

    def _set_button_sensitivity(self, status):
        '''
        Allow to change sensitivity of all buttons on screen.
        '''
        for button in self.all_buttons:
            button.set_sensitive(status)

    def loop(self):
        '''
        Executes callbacks if the program is in runmode (button on the GUI)
        '''
        if self.run_mode == True:
            # WiFi ops (including Watchdog)
            if self.wifi:
                wifi_msg = self.wifi.read()
                if wifi_msg:
                    self.boat.send_command(wifi_msg)
                if self.wifi.remote_address:
                    if self.last_sent_wifi_message != self.boat.last_msg:
                        self.wifi.write(self.boat.last_msg)
                        self.last_sent_wifi_message = self.boat.last_msg
                    elapsed = time() - self.wifi.last_wifi_in_time
                    if self.watchdog and WIFI_MAYBE_LOST < elapsed:
                        self.wifi.ping()
                        if WIFI_CONSIDER_LOST < elapsed:
                            self.boat.send_command(SET_PILOT_MODE, RC)
                            self.wifi = None
            # Logging ops
            if self.logging_mode:
                self.do_log()
            # Pll message
            self.boat.poll_message(self.active_systems)
        return True    #Necessary to keep it being scheduled by GObject

    def _subsystem(self, subsystem, widget):
        '''
        Helper function to manage the self.active_systems record
        '''
        if widget.get_active():
            self.active_systems.add(subsystem)
        else:
            self.active_systems.remove(subsystem)

    def on_run_button_toggled(self, widget):
        self.run_mode = widget.get_active()
        if self.run_mode:
            self.boat.send_command(SET_LOG_INTERVAL, 3)
        else:
            self.boat.send_command(SET_LOG_INTERVAL, 0)

    def on_use_accelerometer_toggled(self, widget):
        self._subsystem('accelerometer', widget)

    def on_use_gps_toggled(self, widget):
        self._subsystem('GPS', widget)
        if widget.get_active():
            self.fr.gps_up()
        else:
            self.fr.gps_down()

    def on_battery_info_toggled(self, widget):
        self._subsystem('battery_info', widget)

    def on_wireless_watchdog_toggled(self, widget):
        self.watchdog = True if widget.get_active() else False

    def on_wireless_bridge_toggled(self, widget):
        if widget.get_active():
            self.wifi = wifibridge.WifiBridge()
            self.last_sent_wifi_message = ''
        else:
            self.wifi = None

    def on_log_data_toggled(self, widget):
        self.logging_mode = widget.get_active()