def create_tabbed_menu(self): tabbed_menu = TabbedPanel(size_hint=(None, 1), size=(200, 0), pos_hint={ 'left': 1, 'top': 1 }, do_default_tab=False, border=(0, 0, 0, 0), tab_pos='top_mid', tab_width=200) # Color panel with tabbed_menu.canvas.before: tabbed_menu.rect = Image(source=BKGD_DCHRC, allow_stretch=True, keep_ratio=False, size_hint=(1, 1)) tabbed_menu.bind(pos=self.update_rect, size=self.update_rect) tabbed_menu.preset_tab = HoverTab(text='Presets', background_normal=TAB_DCHRC[0], background_down=TAB_DCHRC[1]) tabbed_menu.add_widget(tabbed_menu.preset_tab) self.panel_layout.add_widget(tabbed_menu) return tabbed_menu
def build(self): tabbedpanel = TabbedPanel(do_default_tab = False) tabbedpanel.bind(current_tab = self.on_current_tab) self.curtab = None self.filechooser = FileChooser(path = os.path.abspath('.'), on_submit = self.on_file_submit) self.filechooserheader = TabbedPanelHeader(text = 'Select file', content = self.filechooser) tabbedpanel.add_widget(self.filechooserheader) self.qrwidget = QRCode() self.qrwidget.borderwidth = self.config.getint('settings', 'borderwidth') self.on_config_change(self.config, 'settings', 'error', self.config.get('settings', 'error')) self.qrwidget.imagery = self.config.get('settings', 'imagery') self.qrwidgetheader = TabbedPanelHeader(text = 'Sending', content = self.qrwidget) tabbedpanel.add_widget(self.qrwidgetheader) self.readiter = None self.writefile = None self.cameraheaders = ( TabbedPanelHeader(text = 'Camera 1'),#, content = Camera(index = 0, play = False)), TabbedPanelHeader(text = 'Camera 2')#, content = Camera(index = 1, play = False)) ) for cameraheader in self.cameraheaders: tabbedpanel.add_widget(cameraheader) #self.camera = Camera(index=1) #self.camera._camera.bind(on_texture = self.on_camtexture) #self.camera._camera.widget = self.camera #pagelayout.add_widget(self.camera) self.settingsheader = TabbedPanelHeader(text = 'Settings', content = self._app_settings) tabbedpanel.add_widget(self.settingsheader) self.tabbedpanel = tabbedpanel self.settings_cls = SettingsWithNoMenu # this seems clearer than doing the hack to make dynamic creation work in tabbedpanel self._app_settings = self.create_settings() return tabbedpanel
class dashboard(App): def __init__(self, arg=None): super(dashboard, self).__init__() self.arg = arg self.run() def build(self): self.connect() self.load_sounds() self.main_tab = TabbedPanel() self.trim_tab = TrimTab(self.vehicle, self.main_tab) #self.main_tab.bind(children=self.on_switch) self.main_tab.bind(current_tab=self.on_switch) self.update_tab_callbacks() self.prepare() self.main_tab.default_tab_text = "Basic" self.main_tab.default_tab_content = self.dashboard_base_tab() th = TabbedPanelHeader(text="Speed asist") th.content = self.dashboard_speed_tab() self.main_tab.add_widget(th) th = TabbedPanelHeader(text="Trim") th.content = self.trim_tab.content() self.main_tab.add_widget(th) #self.main_tab.add_widget(self.draw_bottom_line()) self.status_release = -9 self.status_bar = BoxLayout(orientation="horizontal") self.last_update = Label() self.last_update.text = "Test..." self.status_bar.add_widget(self.last_update) self.status_bar.size_hint = (None, 0.1) self.window = BoxLayout(orientation="vertical") self.window.add_widget(self.main_tab) self.window.add_widget(self.status_bar) return self.window def on_switch(self, widget, tab): #print("Switch to", tab.content.children, self.trim_tab.content) self.trim_tab.set_active(False) if tab.content == self.trim_tab.content: print("Zapinam TrimTab") self.trim_tab.set_active(True) def load_sounds(self): self.sound_ping = SoundLoader.load('media/sounds/short-ping.wav') self.sound_pop = SoundLoader.load('media/sounds/pop.wav') def prepare(self): self.target_speed = 10.0 self.target_airspeed = True def alert(self, alert): Logger.info('ALERT:' + alert) def update_tab_callbacks(self): Logger.info("Nastavuji callbacky") self.callback_global = Clock.schedule_interval(self.cb_global, 1 / 10) self.callback_base = Clock.schedule_interval(self.cb_base, 1 / 10) self.callback_speed = Clock.schedule_interval(self.cb_speed_asistent, 1 / 10) self.callback_trim = Clock.schedule_interval(self.trim_tab.update, 1 / 10) def connect(self, ip="0.0.0.0", port=11000): self.vehicle = connect("0.0.0.0:11000", status_printer=self.alert) #self.vehicle = connect("10.42.0.1:14550", status_printer = self.alert) #self.vehicle = connect("0.0.0.0:14550", status_printer = self.alert) self.vehicle.initialize() Logger.info('Connected to vehicle') self.tts = pyttsx3.init() def cb_global(self, time): self.last_update.text = " Last update in: {:.2f}".format( self.vehicle.last_heartbeat) def cb_base(self, time): self.w_base_pitch_value.text = ''' Pitch: {:=+8.2f} Roll: {:=+8.2f} Yaw: {:=+8.2f} '''.format(math.degrees(self.vehicle.attitude.pitch), math.degrees(self.vehicle.attitude.roll), math.degrees(self.vehicle.attitude.yaw)) armed = "ARMed" if self.vehicle.armed else "DISARMed" self.w_base_status_text.text = ''' {} {} {} '''.format(self.vehicle.system_status.state, self.vehicle.mode.name, armed) self.w_base_spd_value.text = ''' Aspd: {:5.2f} Gspd: {:5.2f} '''.format(self.vehicle.airspeed, self.vehicle.groundspeed) self.w_base_gps_value.text = ''' FIX: {} Count: {} VHDOP: {}\{} '''.format(self.vehicle.gps_0.fix_type, self.vehicle.gps_0.satellites_visible, self.vehicle.gps_0.epv, self.vehicle.gps_0.eph) def dashboard_base_tab(self): canvas = GridLayout() canvas.cols = 3 l = BoxLayout(orientation='vertical') l.add_widget(Label(text="Status")) self.w_base_status_text = Label(font_size="20sp", halign="center") l.add_widget(self.w_base_status_text) canvas.add_widget(l) l = BoxLayout(orientation='vertical') l.add_widget(Label(text="Attitude")) self.w_base_pitch_value = Label(font_size="25sp", halign="left") l.add_widget(self.w_base_pitch_value) canvas.add_widget(l) l = BoxLayout(orientation='vertical') l.add_widget(Label(text="Speed")) self.w_base_spd_value = Label(font_size="25sp", halign="left") l.add_widget(self.w_base_spd_value) canvas.add_widget(l) l = BoxLayout(orientation='vertical') l.add_widget(Label(text="GPS")) self.w_base_gps_value = Label(font_size="25sp", halign="left") l.add_widget(self.w_base_gps_value) canvas.add_widget(l) canvas.add_widget(wValue()) return canvas def cb_speed_asistent(self, time): #self.w_spd_release_status.text = "Aspd: {:=6.3f}".format(self.vehicle.airspeed) #self.w_spd_speed_info.text = "Gspd: {:=6.3f}".format(self.vehicle.groundspeed) #self.w_spd_targetspeed.text = "{}m\s ({})".format(self.target_speed, self.target_speed*3.6) if self.status_release != round( (self.vehicle.channels.get('16', 0) - 1500) / 500.0): self.status_release = round( (self.vehicle.channels.get('16', 0) - 1500) / 500.0) self.sound_ping.play() if self.status_release == -1: text = "Připojeno" color = "00ff00" elif self.status_release == 1: text = "Odpojeno" color = "ff0000" else: text = "--neznám--" color = "FFA500" text = "[b][color={}][size=50]{}[/size][/color][/b]".format( color, text) self.w_spd_release_status.text = text self.w_spd_speed_info.text = "Airspeed:[size=24]\n{:.2f}[/size]\n".format( self.vehicle.airspeed * 3.6) self.w_spd_speed_info.text += "Groundspeed: \n [size=24]{:.2f}[/size] \n".format( self.vehicle.groundspeed * 3.6) self.w_spd_speed_info.text += "Delta: \n [size=24]{:.2f}[/size] \n".format( (self.vehicle.groundspeed - self.vehicle.airspeed) * 3.6) if self.target_airspeed: vspd = self.vehicle.airspeed else: vspd = self.vehicle.groundspeed offset = self.target_speed - vspd if abs(offset) > 8: color = 'ff0000' elif abs(offset) > 3: color = 'ffff00' else: color = '00ff00' self.w_spd_offset.text = """[/size][b][color={}][size=70]{:=+5.0f}[/color][/size][/b]""".format( color, offset * 3.6) self.w_spd_range.set_value(50 - offset * 100 / 14) def cb_set_speed_source(self, instance, value): if value == 'down': if instance.id == 'plus': self.target_speed += 1 elif instance.id == 'minus': self.target_speed -= 1 elif instance.id == 'gspd': self.target_airspeed = False elif instance.id == 'aspd': self.target_airspeed = True self.w_spd_targetspeed.text = "{}m\s ({})".format( self.target_speed, self.target_speed * 3.6) def dashboard_speed_tab(self): canvas = BoxLayout(orientation='vertical') # 1st layer setup = BoxLayout(orientation='horizontal') #setup.height = 20 setup.size_hint = (1, None) btnPlus = Button(text='-', id="minus") self.w_spd_targetspeed = Label(text='10', font_size="20sp") btnMinus = Button(text='+', id="plus") btnAspd = ToggleButton(text='AirSpeed', id="aspd", group='speed_source', state='down') btnGspd = ToggleButton(text='GndSpeed', id="gspd", group='speed_source') btnAspd.bind(state=self.cb_set_speed_source) btnGspd.bind(state=self.cb_set_speed_source) btnPlus.bind(state=self.cb_set_speed_source) btnMinus.bind(state=self.cb_set_speed_source) swRead = Switch(active=False) swRead.bind(active=self.toggle_reading) setup.add_widget(btnPlus) setup.add_widget(self.w_spd_targetspeed) setup.add_widget(btnMinus) setup.add_widget(btnAspd) setup.add_widget(btnGspd) setup.add_widget(swRead) # zaskrtavatko - hlas, tón, pipani # Ukazatel data = BoxLayout(orientation='horizontal') data_actual = BoxLayout(orientation='vertical') self.w_spd_release_status = Label(text="--Release--", markup=True) self.w_spd_speed_info = Label(text="info", markup=True, halign="center") data_actual.add_widget(self.w_spd_release_status) data_actual.add_widget(self.w_spd_speed_info) data_offset = BoxLayout(orientation='vertical') self.w_spd_offset = Label(text="Err", font_size="50sp", markup=True) data_offset.add_widget(self.w_spd_offset) self.w_spd_range = Range() data.add_widget(data_actual) data.add_widget(data_offset) data.add_widget(self.w_spd_range) canvas.add_widget(setup) canvas.add_widget(data) return canvas def toggle_reading(self, widget, state): if state: self.reading_timer = Clock.schedule_interval( self.read_velocity, 1.5) else: self.reading_timer.cancel() def read_velocity(self, time): print("Rychlost je", self.vehicle.airspeed * 3.6) self.tts.say("{}".format(round(self.vehicle.airspeed * 3.6))) self.tts.runAndWait()