def on_current_channel(self, instance, value): icon = '' if value == True: icon = '\357\200\224' self.highlight_color = ColorScheme.get_primary() else: self.highlight_color = ColorScheme.get_dark_background_translucent() self.ids.action_button.text = icon
def on_current_channel(self, instance, value): icon = '' if value == True: icon = '\357\200\224' self.highlight_color = ColorScheme.get_primary() else: self.highlight_color = ColorScheme.get_dark_background_translucent( ) self.ids.action_button.text = icon
class LapItemButton(ToggleButton): background_color_normal = ColorScheme.get_dark_background() background_color_down = ColorScheme.get_primary() def __init__(self, session, lap, laptime, **kwargs): super(LapItemButton, self).__init__(**kwargs) self.background_normal = "" self.background_down = "" self.background_color = self.background_color_normal self.session = session self.lap = lap self.laptime = laptime def on_state(self, instance, value): self.background_color = self.background_color_down if value == 'down' else self.background_color_normal
class LapItemButton(ToggleButton): Builder.load_string(""" <LapItemButton>: #background_down: '' font_size: self.height * 0.5 font_name: 'resource/fonts/ASL_light.ttf' """) background_color_normal = ColorScheme.get_dark_background() background_color_down = ColorScheme.get_primary() def __init__(self, session, lap, laptime, **kwargs): super(LapItemButton, self).__init__(**kwargs) self.background_normal = "" self.background_down = "" self.background_color = self.background_color_normal self.session = session self.lap = lap self.laptime = laptime def on_state(self, instance, value): self.background_color = self.background_color_down if value == 'down' else self.background_color_normal
class RaceTrackView(BoxLayout): Builder.load_string(RACETRACK_VIEW_KV) track_color = ListProperty(ColorScheme.get_primary()) def __init__(self, **kwargs): super(RaceTrackView, self).__init__(**kwargs) def loadTrack(self, track): self.initMap(track) def initMap(self, track): self.ids.trackmap.setTrackPoints(track.map_points) self.ids.trackmap.sector_points = track.sector_points self.ids.trackmap.start_point = track.start_finish_point self.ids.trackmap.finish_point = track.finish_point def remove_reference_mark(self, key): self.ids.trackmap.remove_marker(key) def add_reference_mark(self, key, color): trackmap = self.ids.trackmap if trackmap.get_marker(key) is None: trackmap.add_marker(key, color) def update_reference_mark(self, key, geo_point): self.ids.trackmap.update_marker(key, geo_point) def add_map_path(self, key, path, color): self.ids.trackmap.add_path(key, path, color) def remove_map_path(self, key): self.ids.trackmap.remove_path(key) def add_heat_values(self, key, heat_values): self.ids.trackmap.add_heat_values(key, heat_values) def remove_heat_values(self, key): self.ids.trackmap.remove_heat_values(key)
class StatusView(Screen): _bg_current = RAW_STATUS_BGCOLOR_1 # Dict object that contains the status of RCP status = ObjectProperty(None) # Currently selected menu item _selected_item = None _menu_built = False # Track manager for getting track name track_manager = None # Connection to status pump _status_pump = None # Used for building the left side menu _menu_keys = { "app": "Application", "system": "Device", "GPS": "GPS", "cell": "Cellular", "bt": "Bluetooth", "logging": "Logging", "track": "Track", "telemetry": "Telemetry", "wifi": "WiFi", "imu": "Accel/Gyro", } # Dict for getting English text for status enums _enum_keys = { 'GPS': { 'init': ['Not initialized', 'Initialized', 'Error initializing'], 'qual': ['No fix', 'Weak', 'Acceptable', 'Strong'] }, 'cell': { 'init': [ 'Not initialized', 'Initialized', 'Searching', 'Denied', 'Registered' ], 'sig_str': [ 'Unknown', 'Marginal', 'Marginal', 'Marginal', 'Marginal', 'Marginal', 'Marginal', 'Marginal', 'Marginal', 'Marginal', 'OK', 'OK', 'OK', 'OK', 'OK', 'Good', 'Good', 'Good', 'Good', 'Good', 'Excellent', 'Excellent', 'Excellent', 'Excellent', 'Excellent', 'Excellent', 'Excellent', 'Excellent', 'Excellent', 'Excellent', 'Excellent' ] }, 'bt': { 'init': ['Not initialized', 'Initialized', 'Error initializing'] }, 'wifi': { 'init': ['Not initialized', 'Initialized'] }, 'logging': { 'status': ['Not logging', 'Logging', 'Error logging'] }, 'track': { 'status': ['Searching', 'Fixed start/finish', 'Detected', 'Manually Set'] }, 'telemetry': { 'status': [ 'Idle', 'Connected', 'Connection terminated', 'Device ID rejected', 'Data connection failed. SIM card is valid, either no data plan is associated or the plan has expired.', 'Failed to connect to server', 'Data connection failed. APN settings possibly wrong.', 'Unable to join network' ] } } _menu_node = None menu_select_color = ColorScheme.get_primary() def __init__(self, track_manager, status_pump, **kwargs): Builder.load_file(STATUS_KV_FILE) super(StatusView, self).__init__(**kwargs) self.track_manager = track_manager self.register_event_type('on_tracks_updated') self._menu_node = self.ids.menu self._menu_node.bind(selected_node=self._on_menu_select) status_pump.add_listener(self.status_updated) self._build_core_menu() def _build_core_menu(self): # build application status node self._append_menu_node('Application', 'app') # select the first node in the tree. self._menu_node.select_node(self._menu_node.root.nodes[0]) def _build_menu(self): if self._menu_built: return for item in self.status.iterkeys(): text = self._menu_keys[item] if item in self._menu_keys else item self._append_menu_node(text, item) self._menu_built = True def _append_menu_node(self, text, item): label = LinkedTreeViewLabel(text=text) label.id = item label.color_selected = self.menu_select_color return self._menu_node.add_node(label) def _on_menu_select(self, instance, value): self._selected_item = value.id self.update() def status_updated(self, status): self.status = status['status'] def update(self): _bg_current = RAW_STATUS_BGCOLOR_1 if self._selected_item in self._menu_keys: text = self._menu_keys[self._selected_item] else: text = self._selected_item self.ids.name.text = text self.ids.status_grid.clear_widgets() function_name = ('render_' + self._selected_item).lower() # Generic way of not having to create a long switch or if/else block # to call each render function if function_name in dir(self): getattr(self, function_name)() else: self.render_generic(self._selected_item) def render_generic(self, section): status = self.status[section] for item, value in status.iteritems(): self._add_item(item, value) def render_app(self): label_widget = StatusTitle(text='Application Log') self.ids.status_grid.add_widget(label_widget) self.ids.status_grid.add_widget(ApplicationLogView()) self._add_item('Application Version', RaceCaptureApp.get_app_version()) def render_system(self): if 'git_info' in self.status['system']: version = self.status['system']['git_info'] else: version = '.'.join([ str(self.status['system']['ver_major']), str(self.status['system']['ver_minor']), str(self.status['system']['ver_bugfix']) ]) self._add_item('Version', version) self._add_item('Serial Number', self.status['system']['serial']) uptime = timedelta(seconds=(self.status['system']['uptime'] / 1000)) self._add_item('Uptime', uptime) def render_gps(self): status = self.status['GPS'] init_status = self._get_enum_definition('GPS', 'init', status['init']) quality = self._get_enum_definition('GPS', 'qual', status['qual']) location = str(status['lat']) + ', ' + str(status['lon']) satellites = status['sats'] dop = status['DOP'] self._add_item('Status', init_status) self._add_item('GPS Quality', quality) self._add_item('Location', location) self._add_item('Satellites', satellites) self._add_item('Dilution of precision', dop) def render_cell(self): status = self.status['cell'] init_status = self._get_enum_definition('cell', 'init', status['init']) imei = status['IMEI'] signal_strength = self._get_enum_definition('cell', 'sig_str', status['sig_str'], 'Unknown') number = status['number'] self._add_item('Status', init_status) self._add_item('IMEI', imei) self._add_item('Signal strength', signal_strength) self._add_item('Phone Number', number) self._add_item('Network Status', status.get('state', '').capitalize()) def render_bt(self): status = self.status['bt'] init_status = self._get_enum_definition('bt', 'init', status['init']) self._add_item('Status', init_status) def render_wifi(self): status = self.status['wifi'] initialized = status['initialized'] ap_enabled = status['ap']['active'] self._add_item( 'Status', self._get_enum_definition('wifi', 'init', int(status['initialized']))) self._add_item('Access Point', 'Enabled' if ap_enabled else 'Disabled') client_enabled = status['client']['active'] client_connected = status['client']['connected'] connected_msg = '' if not client_enabled else '({})'.format( 'Connected' if client_connected else 'Disconnected') client_status_msg = '{} {}'.format( 'Enabled' if client_enabled else 'Disabled', connected_msg) self._add_item('Client', client_status_msg) def render_imu(self): status = self.status['imu'] self._add_item('Status', 'Initialized' if status['init'] else 'Not initialized') def render_logging(self): status = self.status['logging'] init_status = self._get_enum_definition('logging', 'status', status['status']) duration = timedelta(seconds=(status['dur'] / 1000)) self._add_item('Status', init_status) self._add_item('Logging for', duration) def render_telemetry(self): status = self.status['telemetry'] init_status = self._get_enum_definition('telemetry', 'status', status['status']) duration = timedelta(seconds=(status['dur'] / 1000)) self._add_item('Status', init_status) self._add_item('Logging for', duration) def render_track(self): status = self.status['track'] init_status = self._get_enum_definition('track', 'status', status['status']) if status['status'] == 1: track_name = 'User defined' else: if status['trackId'] != 0: track = self.track_manager.find_track_by_short_id( status['trackId']) if track is None: if status['status'] == 1: track_name = 'Fixed' else: track_name = 'Track not found' else: track_name = track.name configuration_name = track.configuration if configuration_name and len(configuration_name): track_name += ' (' + configuration_name + ')' else: track_name = 'No track detected' in_lap = 'Yes' if status['inLap'] == 1 else 'No' armed = 'Yes' if status['armed'] == 1 else 'No' self._add_item('Status', init_status) self._add_item('Track', track_name) self._add_item('In lap', in_lap) self._add_item('Armed', armed) def _add_item(self, label, data): label_widget = StatusTitle(text=label) data_widget = StatusValue(text=str(data)) self.ids.status_grid.add_widget(label_widget) self.ids.status_grid.add_widget(data_widget) if len(self.ids.status_grid.children) / 2 % 2 == 0: bg_color = RAW_STATUS_BGCOLOR_2 else: bg_color = RAW_STATUS_BGCOLOR_1 label_widget.backgroundColor = bg_color data_widget.backgroundColor = bg_color def on_status(self, instance, value): self._build_menu() self.update() # Generalized function for getting an enum's English # equivalent. If the value is not found, the enum is returned def _get_enum_definition(self, section, subsection, value, default=None): val = default if default is not None else value if section in self._enum_keys and subsection in self._enum_keys[ section]: enum_data = self._enum_keys[section][subsection] if len(enum_data) > value: val = enum_data[value] return val def on_tracks_updated(self, track_manager): pass