def _update_speed_color(self): ''' Selects the appropriate color for the exit speed indicator based on configured speed threshold ''' if self.current_speed > self._pitstop_alert_speed: self.ids.speed_rect.rect_color = ColorScheme.get_error() self._toggle_exit_speed_alert(ColorScheme.get_error()) elif self.current_speed > self._pitstop_alert_speed * self._SPEED_ALERT_THRESHOLD: self.ids.speed_rect.rect_color = ColorScheme.get_alert() self.exit_speed_color = ColorScheme.get_dark_background_translucent() else: self.ids.speed_rect.rect_color = ColorScheme.get_happy() self.exit_speed_color = ColorScheme.get_dark_background_translucent()
class ToolbarView(BoxLayout): status_pump = ObjectProperty(None) track_manager = ObjectProperty(None) TELEMETRY_IDLE = 0 TELEMETRY_ACTIVE = 1 TELEMETRY_CONNECTING = 2 TELEMETRY_ERROR = 3 telemetry_color = { TELEMETRY_IDLE: [0.0, 1.0, 0.0, 0.2], TELEMETRY_ACTIVE: [0.0, 1.0, 0.0, 1.0], TELEMETRY_CONNECTING: [1.0, 1.0, 0.0, 1.0], TELEMETRY_ERROR: [1.0, 0.0, 0.0, 1.0] } txOffColor = [0.0, 1.0, 0.0, 0.2] rxOffColor = [0.0, 0.8, 1.0, 0.2] txOnColor = [0.0, 1.0, 0.0, 1.0] rxOnColor = [0.0, 0.8, 1.0, 1.0] normalStatusColor = ColorScheme.get_light_primary_text() alertStatusColor = ColorScheme.get_alert() teleStatus = None rcTxStatus = None rcRxStatus = None def __init__(self, **kwargs): super(ToolbarView, self).__init__(**kwargs) self.current_status = '' self.register_event_type('on_main_menu') self.register_event_type('on_progress') self.register_event_type('on_rc_tx') self.register_event_type('on_rc_rx') self.register_event_type('on_tele_status') self.register_event_type('on_status') self.register_event_type('on_activity') self._rcTxDecay = Clock.create_trigger(self.on_rc_tx_decay, TOOLBAR_LED_DURATION) self._rcRxDecay = Clock.create_trigger(self.on_rc_rx_decay, TOOLBAR_LED_DURATION) self._activityDecay = Clock.create_trigger( self.on_activity_decay, ACTIVITY_MESSAGE_LINGER_DURATION) self._progressDecay = Clock.create_trigger( self.on_progress_decay, PROGRESS_COMPLETE_LINGER_DURATION) def on_status_pump(self, instance, value): value.add_listener(self.on_rc_status_updated) def on_rc_status_updated(self, status_data): self._update_track_status(status_data) def on_activity(self, msg): self.setActivityMessage(msg) self._activityDecay() def set_state_message(self, msg): self.ids.state.text = msg def setActivityMessage(self, msg): prog_status = self.ids.prog_status prog_status.text = msg def on_status(self, msg, isAlert): statusLabel = self.ids.prog_status statusLabel.text = msg self.current_status = msg if isAlert == True: statusLabel.text_color = self.alertStatusColor else: statusLabel.text_color = self.normalStatusColor def update_progress(self, value): self.ids.prog_status.value = value if value == 100: self._progressDecay() def on_progress(self, value): self.update_progress(value) def on_main_menu(self, instance, *args): pass def mainMenu(self): self.dispatch('on_main_menu', None) def on_progress_decay(self, dt): self.update_progress(0) self.ids.prog_status.text = self.current_status def on_activity_decay(self, dt): self.setActivityMessage(self.current_status) def on_rc_tx_decay(self, dt): self.on_rc_tx(False) def on_rc_tx(self, value): if not self.rcTxStatus: self.rcTxStatus = self.ids.rcTxStatus self.rcTxStatus.color = self.txOnColor if value else self.txOffColor self._rcTxDecay() def on_rc_rx_decay(self, dt): self.on_rc_rx(False) def on_rc_rx(self, value): if not self.rcRxStatus: self.rcRxStatus = self.ids.rcRxStatus self.rcRxStatus.color = self.rxOnColor if value else self.rxOffColor self._rcRxDecay() def on_tele_status(self, status): if not self.teleStatus: self.teleStatus = self.ids.teleStatus try: self.teleStatus.color = self.telemetry_color[status] except: Logger.error("ToolbarView: Invalid telemetry status: " + str(status)) def _update_track_status(self, status_data): try: track_status = status_data['status']['track'] detection_status = track_status['status'] if detection_status == 0: track_status_msg = 'Searching for Track' elif detection_status == 1: track_status_msg = 'User defined Track' else: if track_status['trackId'] != 0: track = self.track_manager.find_track_by_short_id( track_status['trackId']) if track is None: track_status_msg = '(Unknown Track)' else: track_status_msg = track.name configuration_name = track.configuration if configuration_name and len(configuration_name): track_status_msg += ' (' + configuration_name + ')' else: track_status_msg = 'No track detected' self.set_state_message(track_status_msg) except Exception as e: Logger.warn( "ToolbarView: Could not retrieve track detection status " + str(e))
class ToolbarView(BoxLayout): """ The Toolbar view provides various status indicators for the running application. """ status_pump = ObjectProperty(None) track_manager = ObjectProperty(None) TELEMETRY_IDLE = 0 TELEMETRY_ACTIVE = 1 TELEMETRY_CONNECTING = 2 TELEMETRY_ERROR = 3 telemetry_color = { TELEMETRY_IDLE: [0.0, 1.0, 0.0, 0.2], TELEMETRY_ACTIVE: [0.0, 1.0, 0.0, 1.0], TELEMETRY_CONNECTING: [1.0, 1.0, 0.0, 1.0], TELEMETRY_ERROR: [1.0, 0.0, 0.0, 1.0] } DATA_NO_RX = 0 DATA_RX = 1 data_rx_color = { DATA_NO_RX: [0.0, 0.8, 1.0, 0.2], DATA_RX: [0.0, 0.8, 1.0, 1.0] } TOOLBAR_DATA_RX_DURATION = 0.1 GPS_NO_DATA = 0 GPS_NO_LOCK = 1 GPS_MARGINAL = 2 GPS_HIGH_QUALITY = 3 gps_color = { GPS_NO_DATA: [0.3, 0.3, 0.3, 0.2], GPS_NO_LOCK: [1.0, 0.0, 0.0, 1.0], GPS_MARGINAL: [1.0, 1.0, 0.0, 1.0], GPS_HIGH_QUALITY: [0.0, 1.0, 0.0, 1.0] } STATUS_LINGER_DURATION = 2.0 ACTIVITY_MESSAGE_LINGER_DURATION = 7.5 PROGRESS_COMPLETE_LINGER_DURATION = 7.0 normal_status_color = ColorScheme.get_light_primary_text() alert_status_color = ColorScheme.get_alert() Builder.load_string(TOOLBAR_VIEW_KV) def __init__(self, **kwargs): super(ToolbarView, self).__init__(**kwargs) self.current_status = '' self.register_event_type('on_main_menu') self.register_event_type('on_progress') self.register_event_type('on_data_rx') self.register_event_type('on_tele_status') self.register_event_type('on_status') self.register_event_type('on_activity') self._data_rx_decay = Clock.create_trigger( self._on_data_rx_decay, ToolbarView.TOOLBAR_DATA_RX_DURATION) self._activity_decay = Clock.create_trigger( self._on_activity_decay, ToolbarView.ACTIVITY_MESSAGE_LINGER_DURATION) self._progress_decay = Clock.create_trigger( self._on_progress_decay, ToolbarView.PROGRESS_COMPLETE_LINGER_DURATION) self._gps_decay = Clock.create_trigger( self._on_gps_decay, ToolbarView.STATUS_LINGER_DURATION) def on_status_pump(self, instance, value): value.add_listener(self.on_rc_status_updated) def on_rc_status_updated(self, status_data): self._update_track_status(status_data) self._update_gps_status(status_data) def on_activity(self, msg): self._set_activity_message(msg) self._activity_decay() def on_main_menu(self, instance, *args): pass def mainMenu(self): self.dispatch('on_main_menu', None) def _set_state_message(self, msg): self.ids.state.text = msg def _set_activity_message(self, msg): prog_status = self.ids.prog_status prog_status.text = msg def on_status(self, msg, isAlert): status_label = self.ids.prog_status status_label.text = msg self.current_status = msg if isAlert == True: status_label.text_color = self.alert_status_color else: status_label.text_color = self.normal_status_color def _update_progress(self, value): self.ids.prog_status.value = value if value == 100: self._progress_decay() def on_progress(self, value): self._update_progress(value) def _on_progress_decay(self, dt): self._update_progress(0) self.ids.prog_status.text = self.current_status def _on_activity_decay(self, dt): self._set_activity_message(self.current_status) def _on_data_rx_decay(self, dt): self.ids.data_rx_status.color = ToolbarView.data_rx_color[int(False)] def on_data_rx(self, value): self._data_rx_decay.cancel() self.ids.data_rx_status.color = ToolbarView.data_rx_color[int(value)] self._data_rx_decay() def on_tele_status(self, status): try: self.ids.tele_status.color = self.telemetry_color[status] except: Logger.error("ToolbarView: Invalid telemetry status: " + str(status)) def _on_gps_decay(self, dt): self.ids.gps_status.color = ToolbarView.gps_color[ ToolbarView.GPS_NO_DATA] def _update_gps_status(self, status_data): self._gps_decay.cancel() gps_status = status_data['status']['GPS'] gps_quality_code = gps_status['qual'] gps_quality = ToolbarView.GPS_NO_DATA if gps_quality_code == 0: gps_quality = ToolbarView.GPS_NO_LOCK elif gps_quality_code == 1: gps_quality = ToolbarView.GPS_MARGINAL elif gps_quality_code >= 2: gps_quality = ToolbarView.GPS_HIGH_QUALITY gps_color = ToolbarView.gps_color[gps_quality] self.ids.gps_status.color = gps_color self._gps_decay() def _update_track_status(self, status_data): try: track_status = status_data['status']['track'] detection_status = track_status['status'] if detection_status == 0: track_status_msg = 'Searching for Track' elif detection_status == 1 and status_data['status']['track'][ 'trackId'] == 0: track_status_msg = 'User defined Track' else: if track_status['trackId'] != 0: track = self.track_manager.find_track_by_short_id( track_status['trackId']) if track is None: track_status_msg = '(Unknown Track)' else: track_status_msg = track.full_name else: track_status_msg = 'No track detected' self._set_state_message(track_status_msg) except Exception as e: Logger.warn( "ToolbarView: Could not retrieve track detection status " + str(e))