Exemplo n.º 1
0
 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()
Exemplo n.º 2
0
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))
Exemplo n.º 3
0
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))