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 __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()
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()