mirror of
https://github.com/markqvist/Sideband.git
synced 2024-10-01 03:15:37 -04:00
1328 lines
59 KiB
Python
1328 lines
59 KiB
Python
import time
|
|
import RNS
|
|
|
|
from typing import Union
|
|
from kivy.metrics import dp,sp
|
|
from kivy.lang.builder import Builder
|
|
from kivy.core.clipboard import Clipboard
|
|
from kivy.utils import escape_markup
|
|
from kivymd.uix.recycleview import MDRecycleView
|
|
from kivymd.uix.list import OneLineIconListItem
|
|
from kivymd.uix.pickers import MDColorPicker
|
|
from kivymd.icon_definitions import md_icons
|
|
from kivy.properties import StringProperty, BooleanProperty
|
|
from kivy.effects.scroll import ScrollEffect
|
|
from kivy.clock import Clock
|
|
from sideband.sense import Telemeter
|
|
import threading
|
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
if RNS.vendor.platformutils.get_platform() == "android":
|
|
from ui.helpers import ts_format
|
|
from android.permissions import request_permissions, check_permission
|
|
else:
|
|
from .helpers import ts_format
|
|
|
|
class Telemetry():
|
|
def __init__(self, app):
|
|
self.app = app
|
|
self.screen = None
|
|
self.sensors_screen = None
|
|
self.icons_screen = None
|
|
self.color_picker = None
|
|
|
|
if not self.app.root.ids.screen_manager.has_screen("telemetry_screen"):
|
|
self.screen = Builder.load_string(layout_telemetry_screen)
|
|
self.screen.app = self.app
|
|
self.screen.delegate = self
|
|
self.app.root.ids.screen_manager.add_widget(self.screen)
|
|
self.app.bind_clipboard_actions(self.screen.ids)
|
|
|
|
self.screen.ids.telemetry_collector.bind(focus=self.telemetry_save)
|
|
if self.app.sideband.config["telemetry_collector"] == None:
|
|
self.screen.ids.telemetry_collector.text = ""
|
|
else:
|
|
self.screen.ids.telemetry_collector.text = RNS.hexrep(self.app.sideband.config["telemetry_collector"], delimit=False)
|
|
|
|
self.screen.ids.telemetry_icon_preview.icon_color = self.app.sideband.config["telemetry_fg"]
|
|
self.screen.ids.telemetry_icon_preview.md_bg_color = self.app.sideband.config["telemetry_bg"]
|
|
self.screen.ids.telemetry_icon_preview.icon = self.app.sideband.config["telemetry_icon"]
|
|
|
|
self.screen.ids.telemetry_enabled.active = self.app.sideband.config["telemetry_enabled"]
|
|
self.screen.ids.telemetry_enabled.bind(active=self.telemetry_enabled_toggle)
|
|
|
|
self.screen.ids.telemetry_collector_enabled.active = self.app.sideband.config["telemetry_collector_enabled"]
|
|
self.screen.ids.telemetry_collector_enabled.bind(active=self.telemetry_save)
|
|
|
|
self.screen.ids.telemetry_send_to_trusted.active = self.app.sideband.config["telemetry_send_to_trusted"]
|
|
self.screen.ids.telemetry_send_to_trusted.bind(active=self.telemetry_save)
|
|
|
|
self.screen.ids.telemetry_display_trusted_only.active = self.app.sideband.config["telemetry_display_trusted_only"]
|
|
self.screen.ids.telemetry_display_trusted_only.bind(active=self.telemetry_save)
|
|
|
|
self.screen.ids.telemetry_receive_trusted_only.active = self.app.sideband.config["telemetry_receive_trusted_only"]
|
|
self.screen.ids.telemetry_receive_trusted_only.bind(active=self.telemetry_save)
|
|
|
|
self.screen.ids.telemetry_send_appearance.active = self.app.sideband.config["telemetry_send_appearance"]
|
|
self.screen.ids.telemetry_send_appearance.bind(active=self.telemetry_save)
|
|
|
|
self.screen.ids.telemetry_send_all_to_collector.active = self.app.sideband.config["telemetry_send_all_to_collector"]
|
|
self.screen.ids.telemetry_send_all_to_collector.bind(active=self.telemetry_save)
|
|
|
|
self.screen.ids.telemetry_use_propagation_only.active = self.app.sideband.config["telemetry_use_propagation_only"]
|
|
self.screen.ids.telemetry_use_propagation_only.bind(active=self.telemetry_save)
|
|
|
|
self.screen.ids.telemetry_try_propagation_on_fail.active = self.app.sideband.config["telemetry_try_propagation_on_fail"]
|
|
self.screen.ids.telemetry_try_propagation_on_fail.bind(active=self.telemetry_save)
|
|
|
|
self.screen.ids.telemetry_requests_only_send_latest.active = self.app.sideband.config["telemetry_requests_only_send_latest"]
|
|
self.screen.ids.telemetry_requests_only_send_latest.bind(active=self.telemetry_save)
|
|
|
|
self.screen.ids.telemetry_allow_requests_from_trusted.active = self.app.sideband.config["telemetry_allow_requests_from_trusted"]
|
|
self.screen.ids.telemetry_allow_requests_from_trusted.bind(active=self.telemetry_save)
|
|
|
|
self.screen.ids.telemetry_allow_requests_from_anyone.active = self.app.sideband.config["telemetry_allow_requests_from_anyone"]
|
|
self.screen.ids.telemetry_allow_requests_from_anyone.bind(active=self.telemetry_save)
|
|
|
|
|
|
self.screen.ids.telemetry_scrollview.effect_cls = ScrollEffect
|
|
info = "\nSideband allows you to securely share telemetry, such as location and sensor data, with people, custom programs, "
|
|
info += "machines or other systems over LXMF. You have complete control over what kind of telemetry to send, and who you share "
|
|
info += "it with.\n\nTelemetry data is never sent to, via or processed by any external services or servers, but is carried "
|
|
info += "exclusively within encrypted LXMF messages over Reticulum, and only to the destinations you define.\n\nWhen telemetry "
|
|
info += "is enabled, it is possible to embed telemetry data in normal messages on a per-peer basis. You can control this from "
|
|
info += "the [b]Conversations[/b] list, by selecting the [b]Edit[/b] option for the relevant peer.\n\nYou can also define a "
|
|
info += "[b]Telemetry Collector[/b], that Sideband can automatically send telemetry to on a periodic basis. By default, only "
|
|
info += "your own telemetry will be sent to the collector, but by enabling the [b]Send all known to collector[/b] option, you "
|
|
info += "can forward all known telemetry to the collector. This can also be used to aggregate telemetry from multiple different "
|
|
info += "collectors, or create chains of transmission.\n\nBy activating the [b]Enable collector[/b] option, this instance of "
|
|
info += "Sideband will become a Telemetry Collector, and other authorized peers will be able to query its collected data.\n"
|
|
|
|
if self.app.theme_cls.theme_style == "Dark":
|
|
info = "[color=#"+self.app.dark_theme_text_color+"]"+info+"[/color]"
|
|
|
|
self.screen.ids.telemetry_info.text = info
|
|
|
|
def send_interval_change(sender=None, event=None, save=True):
|
|
slider_val = int(self.screen.ids.telemetry_send_interval.value)
|
|
mseg = 72; hseg = 84
|
|
if slider_val <= mseg:
|
|
interval = slider_val*5*60
|
|
elif slider_val > mseg and slider_val <= mseg+hseg:
|
|
h = (slider_val-mseg)/2; mm = mseg*5*60
|
|
interval = h*60*60+mm
|
|
else:
|
|
d = slider_val-hseg-mseg
|
|
hm = (hseg/2)*60*60; mm = mseg*5*60
|
|
interval = d*86400+hm+mm
|
|
|
|
interval_text = RNS.prettytime(interval)
|
|
if self.screen.ids.telemetry_send_to_collector.active:
|
|
self.screen.ids.telemetry_send_to_collector_label.text = "Auto sync to collector every "+interval_text
|
|
else:
|
|
self.screen.ids.telemetry_send_to_collector_label.text = "Auto sync to collector"
|
|
|
|
if save:
|
|
self.app.sideband.config["telemetry_send_interval"] = interval
|
|
self.app.sideband.save_configuration()
|
|
|
|
def save_send_to_collector(sender=None, event=None, save=True):
|
|
if self.screen.ids.telemetry_send_to_collector.active:
|
|
self.widget_hide(self.screen.ids.send_syncslider_container, False)
|
|
else:
|
|
self.widget_hide(self.screen.ids.send_syncslider_container, True)
|
|
|
|
if save:
|
|
self.app.sideband.config["telemetry_send_to_collector"] = self.screen.ids.telemetry_send_to_collector.active
|
|
self.app.sideband.save_configuration()
|
|
|
|
send_interval_change(save=False)
|
|
|
|
self.screen.ids.telemetry_send_to_collector.active = self.app.sideband.config["telemetry_send_to_collector"]
|
|
self.screen.ids.telemetry_send_to_collector.bind(active=save_send_to_collector)
|
|
save_send_to_collector(save=False)
|
|
|
|
def send_interval_change_cb(sender=None, event=None):
|
|
send_interval_change(sender=sender, event=event, save=False)
|
|
self.screen.ids.telemetry_send_interval.bind(value=send_interval_change_cb)
|
|
self.screen.ids.telemetry_send_interval.bind(on_touch_up=send_interval_change)
|
|
self.screen.ids.telemetry_send_interval.value = self.interval_to_slider_val(self.app.sideband.config["telemetry_send_interval"])
|
|
send_interval_change(save=False)
|
|
|
|
def request_interval_change(sender=None, event=None, save=True):
|
|
slider_val = int(self.screen.ids.telemetry_request_interval.value)
|
|
mseg = 72; hseg = 84
|
|
if slider_val <= mseg:
|
|
interval = slider_val*5*60
|
|
elif slider_val > mseg and slider_val <= mseg+hseg:
|
|
h = (slider_val-mseg)/2; mm = mseg*5*60
|
|
interval = h*60*60+mm
|
|
else:
|
|
d = slider_val-hseg-mseg
|
|
hm = (hseg/2)*60*60; mm = mseg*5*60
|
|
interval = d*86400+hm+mm
|
|
|
|
interval_text = RNS.prettytime(interval)
|
|
if self.screen.ids.telemetry_request_from_collector.active:
|
|
self.screen.ids.telemetry_request_from_collector_label.text = "Auto sync from collector every "+interval_text
|
|
else:
|
|
self.screen.ids.telemetry_request_from_collector_label.text = "Auto sync from collector"
|
|
|
|
if save:
|
|
self.app.sideband.config["telemetry_request_interval"] = interval
|
|
self.app.sideband.save_configuration()
|
|
|
|
def save_request_from_collector(sender=None, event=None, save=True):
|
|
if self.screen.ids.telemetry_request_from_collector.active:
|
|
self.widget_hide(self.screen.ids.request_syncslider_container, False)
|
|
else:
|
|
self.widget_hide(self.screen.ids.request_syncslider_container, True)
|
|
|
|
if save:
|
|
self.app.sideband.config["telemetry_request_from_collector"] = self.screen.ids.telemetry_request_from_collector.active
|
|
self.app.sideband.save_configuration()
|
|
|
|
request_interval_change(save=False)
|
|
|
|
self.screen.ids.telemetry_request_from_collector.active = self.app.sideband.config["telemetry_request_from_collector"]
|
|
self.screen.ids.telemetry_request_from_collector.bind(active=save_request_from_collector)
|
|
save_request_from_collector(save=False)
|
|
|
|
def request_interval_change_cb(sender=None, event=None):
|
|
request_interval_change(sender=sender, event=event, save=False)
|
|
self.screen.ids.telemetry_request_interval.bind(value=request_interval_change_cb)
|
|
self.screen.ids.telemetry_request_interval.bind(on_touch_up=request_interval_change)
|
|
self.screen.ids.telemetry_request_interval.value = self.interval_to_slider_val(self.app.sideband.config["telemetry_request_interval"])
|
|
request_interval_change(save=False)
|
|
|
|
|
|
def interval_to_slider_val(self, interval):
|
|
try:
|
|
mseg = 72; hseg = 84; sv = 0
|
|
mm = mseg*5*60; hm = hseg*60*30+mm
|
|
|
|
if interval <= mm:
|
|
sv = interval/60/5
|
|
elif interval > mm and interval <= hm:
|
|
half_hours = interval/(60*30)-(mm/(60*30))
|
|
sv = mseg+half_hours
|
|
else:
|
|
days = (interval/86400)-((hseg*60*30)/84600)-(mm/86400)
|
|
sv = 1+mseg+hseg+days
|
|
except Exception as e:
|
|
return 43200
|
|
|
|
return sv
|
|
|
|
def widget_hide(self, w, hide=True):
|
|
if hasattr(w, "saved_attrs"):
|
|
if not hide:
|
|
w.height, w.size_hint_y, w.opacity, w.disabled = w.saved_attrs
|
|
del w.saved_attrs
|
|
elif hide:
|
|
w.saved_attrs = w.height, w.size_hint_y, w.opacity, w.disabled
|
|
w.height, w.size_hint_y, w.opacity, w.disabled = 0, None, 0, True
|
|
|
|
def telemetry_enabled_toggle(self, sender=None, event=None):
|
|
self.telemetry_save()
|
|
if self.screen.ids.telemetry_enabled.active:
|
|
self.app.sideband.run_telemetry()
|
|
else:
|
|
self.app.sideband.stop_telemetry()
|
|
|
|
def telemetry_save(self, sender=None, event=None):
|
|
run_telemetry_update = False
|
|
if len(self.screen.ids.telemetry_collector.text) != 32:
|
|
self.screen.ids.telemetry_collector.text = ""
|
|
self.app.sideband.config["telemetry_collector"] = None
|
|
else:
|
|
try:
|
|
self.app.sideband.config["telemetry_collector"] = bytes.fromhex(self.screen.ids.telemetry_collector.text)
|
|
except:
|
|
self.screen.ids.telemetry_collector.text = ""
|
|
self.app.sideband.config["telemetry_collector"] = None
|
|
|
|
run_ui_update = False
|
|
if self.screen.ids.telemetry_allow_requests_from_anyone.active != self.app.sideband.config["telemetry_allow_requests_from_anyone"]:
|
|
run_ui_update = True
|
|
|
|
self.app.sideband.config["telemetry_enabled"] = self.screen.ids.telemetry_enabled.active
|
|
self.app.sideband.config["telemetry_send_to_collector"] = self.screen.ids.telemetry_send_to_collector.active
|
|
self.app.sideband.config["telemetry_send_to_trusted"] = self.screen.ids.telemetry_send_to_trusted.active
|
|
self.app.sideband.config["telemetry_display_trusted_only"] = self.screen.ids.telemetry_display_trusted_only.active
|
|
self.app.sideband.config["telemetry_send_appearance"] = self.screen.ids.telemetry_send_appearance.active
|
|
self.app.sideband.config["telemetry_receive_trusted_only"] = self.screen.ids.telemetry_receive_trusted_only.active
|
|
self.app.sideband.config["telemetry_send_all_to_collector"] = self.screen.ids.telemetry_send_all_to_collector.active
|
|
self.app.sideband.config["telemetry_use_propagation_only"] = self.screen.ids.telemetry_use_propagation_only.active
|
|
self.app.sideband.config["telemetry_try_propagation_on_fail"] = self.screen.ids.telemetry_try_propagation_on_fail.active
|
|
self.app.sideband.config["telemetry_requests_only_send_latest"] = self.screen.ids.telemetry_requests_only_send_latest.active
|
|
self.app.sideband.config["telemetry_allow_requests_from_trusted"] = self.screen.ids.telemetry_allow_requests_from_trusted.active
|
|
self.app.sideband.config["telemetry_allow_requests_from_anyone"] = self.screen.ids.telemetry_allow_requests_from_anyone.active
|
|
self.app.sideband.config["telemetry_collector_enabled"] = self.screen.ids.telemetry_collector_enabled.active
|
|
|
|
self.app.sideband.save_configuration()
|
|
if run_telemetry_update:
|
|
self.app.sideband.update_telemetry()
|
|
else:
|
|
self.app.sideband.setstate("app.flags.last_telemetry", time.time())
|
|
|
|
if run_ui_update:
|
|
self.app.set_ui_theme()
|
|
|
|
def telemetry_copy(self, sender=None):
|
|
Clipboard.copy(str(self.app.sideband.get_telemetry()))
|
|
self.app.sideband.update_telemetry()
|
|
|
|
def telemetry_fg_color(self, sender=None):
|
|
if self.color_picker == None:
|
|
self.color_picker = MDColorPicker(size_hint=(0.85, 0.85))
|
|
|
|
self.color_picker.open()
|
|
self.color_picker.bind(on_release=self.telemetry_fg_select)
|
|
def job(sender=None):
|
|
self.color_picker._rgb = self.app.sideband.config["telemetry_fg"][0:3]
|
|
self.color_picker.ids.view_headline.on_tab_press()
|
|
Clock.schedule_once(job, 0)
|
|
|
|
def telemetry_fg_select(self, instance_color_picker: MDColorPicker, type_color: str, selected_color: Union[list, str]):
|
|
s = selected_color; color = [s[0], s[1], s[2], 1]
|
|
self.screen.ids.telemetry_icon_preview.icon_color = color
|
|
self.app.sideband.config["telemetry_fg"] = color
|
|
self.app.sideband.save_configuration()
|
|
self.own_appearance_changed = True
|
|
if hasattr(self, "color_picker") and self.color_picker != None:
|
|
self.color_picker.dismiss()
|
|
self.color_picker = None
|
|
|
|
def telemetry_bg_color(self, sender=None):
|
|
if self.color_picker == None:
|
|
self.color_picker = MDColorPicker(size_hint=(0.85, 0.85))
|
|
|
|
self.color_picker.open()
|
|
self.color_picker.bind(on_release=self.telemetry_bg_select)
|
|
def job(sender=None):
|
|
self.color_picker._rgb = self.app.sideband.config["telemetry_bg"][0:3]
|
|
self.color_picker.ids.view_headline.on_tab_press()
|
|
Clock.schedule_once(job, 0)
|
|
|
|
def telemetry_bg_select(self, instance_color_picker: MDColorPicker, type_color: str, selected_color: Union[list, str]):
|
|
s = selected_color; color = [s[0], s[1], s[2], 1]
|
|
self.screen.ids.telemetry_icon_preview.md_bg_color = color
|
|
self.app.sideband.config["telemetry_bg"] = color
|
|
self.app.sideband.save_configuration()
|
|
self.own_appearance_changed = True
|
|
if hasattr(self, "color_picker") and self.color_picker != None:
|
|
self.color_picker.dismiss()
|
|
self.color_picker = None
|
|
|
|
|
|
### Sensors Screen
|
|
######################################
|
|
|
|
def sensors_init(self):
|
|
if not self.app.root.ids.screen_manager.has_screen("sensors_screen"):
|
|
self.sensors_screen = Builder.load_string(layout_sensors_screen)
|
|
self.sensors_screen.app = self.app
|
|
self.sensors_screen.delegate = self
|
|
self.app.root.ids.screen_manager.add_widget(self.sensors_screen)
|
|
self.app.bind_clipboard_actions(self.sensors_screen.ids)
|
|
|
|
info3 = "\nTo include a specific type of telemetry data while sending, it must be enabled below. Please note that some sensor types are not supported on all devices. Sideband will only be able to read a specific type of sensor if your device actually includes hardware for it.\n"
|
|
if self.app.theme_cls.theme_style == "Dark":
|
|
info3 = "[color=#"+self.app.dark_theme_text_color+"]"+info3+"[/color]"
|
|
self.sensors_screen.ids.telemetry_info3.text = info3
|
|
self.sensors_screen.ids.sensors_scrollview.effect_cls = ScrollEffect
|
|
|
|
try:
|
|
lat = self.app.sideband.config["telemetry_s_fixed_latlon"][0]; lon = self.app.sideband.config["telemetry_s_fixed_latlon"][1]
|
|
except:
|
|
lat = 0.0; lon = 0.0
|
|
|
|
self.sensors_screen.ids.telemetry_s_location.active = self.app.sideband.config["telemetry_s_location"]
|
|
self.sensors_screen.ids.telemetry_s_location.bind(active=self.telemetry_location_toggle)
|
|
self.sensors_screen.ids.telemetry_s_fixed_location.active = self.app.sideband.config["telemetry_s_fixed_location"]
|
|
self.sensors_screen.ids.telemetry_s_fixed_location.bind(active=self.telemetry_location_toggle)
|
|
self.sensors_screen.ids.telemetry_s_fixed_latlon.bind(focus=self.sensors_save)
|
|
self.sensors_screen.ids.telemetry_s_fixed_altitude.bind(focus=self.sensors_save)
|
|
self.sensors_screen.ids.telemetry_s_fixed_altitude.text = str(self.app.sideband.config["telemetry_s_fixed_altitude"])
|
|
self.sensors_screen.ids.telemetry_s_fixed_latlon.text = f"{lat}, {lon}"
|
|
self.sensors_screen.ids.telemetry_s_battery.active = self.app.sideband.config["telemetry_s_battery"]
|
|
self.sensors_screen.ids.telemetry_s_battery.bind(active=self.sensors_save)
|
|
self.sensors_screen.ids.telemetry_s_barometer.active = self.app.sideband.config["telemetry_s_pressure"]
|
|
self.sensors_screen.ids.telemetry_s_barometer.bind(active=self.sensors_save)
|
|
self.sensors_screen.ids.telemetry_s_temperature.active = self.app.sideband.config["telemetry_s_temperature"]
|
|
self.sensors_screen.ids.telemetry_s_temperature.bind(active=self.sensors_save)
|
|
self.sensors_screen.ids.telemetry_s_humidity.active = self.app.sideband.config["telemetry_s_humidity"]
|
|
self.sensors_screen.ids.telemetry_s_humidity.bind(active=self.sensors_save)
|
|
self.sensors_screen.ids.telemetry_s_compass.active = self.app.sideband.config["telemetry_s_magnetic_field"]
|
|
self.sensors_screen.ids.telemetry_s_compass.bind(active=self.sensors_save)
|
|
self.sensors_screen.ids.telemetry_s_light.active = self.app.sideband.config["telemetry_s_ambient_light"]
|
|
self.sensors_screen.ids.telemetry_s_light.bind(active=self.sensors_save)
|
|
self.sensors_screen.ids.telemetry_s_gravity.active = self.app.sideband.config["telemetry_s_gravity"]
|
|
self.sensors_screen.ids.telemetry_s_gravity.bind(active=self.sensors_save)
|
|
self.sensors_screen.ids.telemetry_s_gyroscope.active = self.app.sideband.config["telemetry_s_angular_velocity"]
|
|
self.sensors_screen.ids.telemetry_s_gyroscope.bind(active=self.sensors_save)
|
|
self.sensors_screen.ids.telemetry_s_accelerometer.active = self.app.sideband.config["telemetry_s_acceleration"]
|
|
self.sensors_screen.ids.telemetry_s_accelerometer.bind(active=self.sensors_save)
|
|
self.sensors_screen.ids.telemetry_s_proximity.active = self.app.sideband.config["telemetry_s_proximity"]
|
|
self.sensors_screen.ids.telemetry_s_proximity.bind(active=self.sensors_save)
|
|
self.sensors_screen.ids.telemetry_s_information.active = self.app.sideband.config["telemetry_s_information"]
|
|
self.sensors_screen.ids.telemetry_s_information.bind(active=self.sensors_save)
|
|
self.sensors_screen.ids.telemetry_s_information_text.text = str(self.app.sideband.config["telemetry_s_information_text"])
|
|
self.sensors_screen.ids.telemetry_s_information_text.bind(focus=self.sensors_save)
|
|
|
|
def sensors_open(self, sender=None, direction="left", no_transition=False):
|
|
if no_transition:
|
|
self.app.root.ids.screen_manager.transition = self.app.no_transition
|
|
else:
|
|
self.app.root.ids.screen_manager.transition = self.app.slide_transition
|
|
self.app.root.ids.screen_manager.transition.direction = direction
|
|
|
|
self.app.root.ids.screen_manager.current = "sensors_screen"
|
|
self.app.root.ids.nav_drawer.set_state("closed")
|
|
self.app.sideband.setstate("app.displaying", self.app.root.ids.screen_manager.current)
|
|
|
|
if no_transition:
|
|
self.app.root.ids.screen_manager.transition = self.app.slide_transition
|
|
|
|
def sensors_action(self, sender=None):
|
|
if self.app.root.ids.screen_manager.has_screen("sensors_screen"):
|
|
self.sensors_open()
|
|
else:
|
|
self.app.loader_action()
|
|
def final(dt):
|
|
self.sensors_init()
|
|
def o(dt):
|
|
self.sensors_open(no_transition=True)
|
|
Clock.schedule_once(o, 0.45)
|
|
Clock.schedule_once(final, 0.275)
|
|
|
|
def telemetry_location_toggle(self, sender=None, event=None):
|
|
if sender == self.sensors_screen.ids.telemetry_s_location:
|
|
if self.sensors_screen.ids.telemetry_s_location.active:
|
|
self.sensors_screen.ids.telemetry_s_fixed_location.active = False
|
|
if sender == self.sensors_screen.ids.telemetry_s_fixed_location:
|
|
if self.sensors_screen.ids.telemetry_s_fixed_location.active:
|
|
self.sensors_screen.ids.telemetry_s_location.active = False
|
|
|
|
|
|
if self.sensors_screen.ids.telemetry_s_location.active:
|
|
if RNS.vendor.platformutils.is_android():
|
|
if not check_permission("android.permission.ACCESS_COARSE_LOCATION") or not check_permission("android.permission.ACCESS_FINE_LOCATION"):
|
|
RNS.log("Requesting location permission", RNS.LOG_DEBUG)
|
|
request_permissions(["android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"])
|
|
|
|
self.sensors_save()
|
|
|
|
def sensors_save(self, sender=None, event=None):
|
|
run_telemetry_update = False
|
|
|
|
self.app.sideband.config["telemetry_s_location"] = self.sensors_screen.ids.telemetry_s_location.active
|
|
self.app.sideband.config["telemetry_s_fixed_location"] = self.sensors_screen.ids.telemetry_s_fixed_location.active
|
|
self.app.sideband.config["telemetry_s_battery"] = self.sensors_screen.ids.telemetry_s_battery.active
|
|
self.app.sideband.config["telemetry_s_pressure"] = self.sensors_screen.ids.telemetry_s_barometer.active
|
|
self.app.sideband.config["telemetry_s_temperature"] = self.sensors_screen.ids.telemetry_s_temperature.active
|
|
self.app.sideband.config["telemetry_s_humidity"] = self.sensors_screen.ids.telemetry_s_humidity.active
|
|
self.app.sideband.config["telemetry_s_magnetic_field"] = self.sensors_screen.ids.telemetry_s_compass.active
|
|
self.app.sideband.config["telemetry_s_ambient_light"] = self.sensors_screen.ids.telemetry_s_light.active
|
|
self.app.sideband.config["telemetry_s_gravity"] = self.sensors_screen.ids.telemetry_s_gravity.active
|
|
self.app.sideband.config["telemetry_s_angular_velocity"] = self.sensors_screen.ids.telemetry_s_gyroscope.active
|
|
self.app.sideband.config["telemetry_s_acceleration"] = self.sensors_screen.ids.telemetry_s_accelerometer.active
|
|
self.app.sideband.config["telemetry_s_proximity"] = self.sensors_screen.ids.telemetry_s_proximity.active
|
|
|
|
if self.app.sideband.config["telemetry_s_information"] != self.sensors_screen.ids.telemetry_s_information.active:
|
|
self.app.sideband.config["telemetry_s_information"] = self.sensors_screen.ids.telemetry_s_information.active
|
|
run_telemetry_update = True
|
|
|
|
if self.app.sideband.config["telemetry_s_information_text"] != self.sensors_screen.ids.telemetry_s_information_text.text:
|
|
self.app.sideband.config["telemetry_s_information_text"] = self.sensors_screen.ids.telemetry_s_information_text.text
|
|
run_telemetry_update = True
|
|
|
|
try:
|
|
alt = float(self.sensors_screen.ids.telemetry_s_fixed_altitude.text.strip().replace(" ", ""))
|
|
self.sensors_screen.ids.telemetry_s_fixed_altitude.text = str(alt)
|
|
if self.app.sideband.config["telemetry_s_fixed_altitude"] != alt:
|
|
self.app.sideband.config["telemetry_s_fixed_altitude"] = alt
|
|
run_telemetry_update = True
|
|
except:
|
|
self.sensors_screen.ids.telemetry_s_fixed_altitude.text = str(self.app.sideband.config["telemetry_s_fixed_altitude"])
|
|
|
|
try:
|
|
s = self.sensors_screen.ids.telemetry_s_fixed_latlon.text
|
|
l = s.strip().replace(" ","").split(",")
|
|
lat = float(l[0]); lon = float(l[1])
|
|
if self.app.sideband.config["telemetry_s_fixed_latlon"] != [lat, lon]:
|
|
run_telemetry_update = True
|
|
self.app.sideband.config["telemetry_s_fixed_latlon"] = [lat, lon]
|
|
self.sensors_screen.ids.telemetry_s_fixed_latlon.text = f"{lat}, {lon}"
|
|
except:
|
|
try:
|
|
lat = self.app.sideband.config["telemetry_s_fixed_latlon"][0]
|
|
lon = self.app.sideband.config["telemetry_s_fixed_latlon"][1]
|
|
self.sensors_screen.ids.telemetry_s_fixed_latlon.text = f"{lat}, {lon}"
|
|
except:
|
|
self.app.sideband.config["telemetry_s_fixed_latlon"] = [0.0, 0.0]
|
|
self.sensors_screen.ids.telemetry_s_fixed_latlon.text = "0.0, 0.0"
|
|
|
|
self.app.sideband.save_configuration()
|
|
if run_telemetry_update:
|
|
self.app.sideband.update_telemetry()
|
|
else:
|
|
self.app.sideband.setstate("app.flags.last_telemetry", time.time())
|
|
|
|
|
|
### Icons Screen
|
|
######################################
|
|
|
|
def icons_action(self, sender=None):
|
|
if not self.app.root.ids.screen_manager.has_screen("icons_screen"):
|
|
self.icons_screen = Builder.load_string(layout_icons_screen)
|
|
self.icons_screen.app = self.app
|
|
self.icons_screen.delegate = self
|
|
self.app.root.ids.screen_manager.add_widget(self.icons_screen)
|
|
self.icons_filter()
|
|
|
|
self.app.root.ids.screen_manager.transition.direction = "left"
|
|
self.app.root.ids.screen_manager.current = "icons_screen"
|
|
self.app.sideband.setstate("app.displaying", self.app.root.ids.screen_manager.current)
|
|
|
|
# sf = self.icons_screen.ids.icons_search_field.text
|
|
# self.icons_filter(sf, len(sf)>0)
|
|
|
|
def telemetry_set_icon(self, text="", search=False):
|
|
if text in md_icons.keys():
|
|
self.screen.ids.telemetry_icon_preview.icon = text
|
|
else:
|
|
self.screen.ids.telemetry_icon_preview.icon = "alpha-p-circle-outline"
|
|
|
|
self.app.sideband.config["telemetry_icon"] = self.screen.ids.telemetry_icon_preview.icon
|
|
self.app.sideband.save_configuration()
|
|
self.own_appearance_changed = True
|
|
|
|
def icons_selected(self, selected=None):
|
|
RNS.log("Selected: "+str(selected))
|
|
if selected == None:
|
|
selected = "alpha-p-circle-outline"
|
|
self.telemetry_set_icon(selected)
|
|
self.app.close_sub_telemetry_action()
|
|
|
|
def icons_filter(self, text="", search=False):
|
|
def add_icon_item(name_icon):
|
|
def select_factory(x):
|
|
def f():
|
|
self.icons_selected(x)
|
|
return f
|
|
|
|
self.icons_screen.ids.icons_rv.data.append(
|
|
{
|
|
"viewclass": "CustomOneLineIconListItem",
|
|
"icon": name_icon,
|
|
"text": name_icon,
|
|
"callback": lambda x: x,
|
|
"on_release": select_factory(name_icon)
|
|
}
|
|
)
|
|
|
|
self.icons_screen.ids.icons_rv.data = []
|
|
for name_icon in md_icons.keys():
|
|
if search:
|
|
if text in name_icon:
|
|
add_icon_item(name_icon)
|
|
else:
|
|
add_icon_item(name_icon)
|
|
|
|
|
|
layout_telemetry_screen = """
|
|
MDScreen:
|
|
name: "telemetry_screen"
|
|
|
|
BoxLayout:
|
|
orientation: "vertical"
|
|
|
|
MDTopAppBar:
|
|
title: "Telemetry"
|
|
anchor_title: "left"
|
|
elevation: 0
|
|
left_action_items:
|
|
[['menu', lambda x: root.app.nav_drawer.set_state("open")]]
|
|
right_action_items:
|
|
[
|
|
['close', lambda x: root.app.close_any_action(self)],
|
|
]
|
|
|
|
ScrollView:
|
|
id: telemetry_scrollview
|
|
|
|
MDBoxLayout:
|
|
orientation: "vertical"
|
|
size_hint_y: None
|
|
height: self.minimum_height
|
|
padding: [dp(28), dp(48), dp(28), dp(16)]
|
|
|
|
MDLabel:
|
|
text: "Telemetry Over LXMF"
|
|
font_style: "H6"
|
|
|
|
MDLabel:
|
|
id: telemetry_info
|
|
markup: True
|
|
text: ""
|
|
size_hint_y: None
|
|
text_size: self.width, None
|
|
height: self.texture_size[1]
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
padding: [0,0,dp(24),0]
|
|
size_hint_y: None
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
id: telemetry_enabled_label
|
|
text: "Enable telemetry"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_enabled
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
padding: [0,0,dp(24),0]
|
|
size_hint_y: None
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Enable collector"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_collector_enabled
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Send display style to everyone"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_send_appearance
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Only display trusted on map"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_display_trusted_only
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Only receive from trusted"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_receive_trusted_only
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
id: telemetry_send_to_collector_label
|
|
text: "Auto sync to collector"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_send_to_collector
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
id: send_syncslider_container
|
|
orientation: "vertical"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(0),0]
|
|
height: dp(68)
|
|
|
|
MDSlider
|
|
id: telemetry_send_interval
|
|
min: 1
|
|
max: 214
|
|
value: 150
|
|
sensitivity: "all"
|
|
hint: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
id: telemetry_request_from_collector_label
|
|
text: "Auto sync from collector"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_request_from_collector
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
id: request_syncslider_container
|
|
orientation: "vertical"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(0),0]
|
|
height: dp(68)
|
|
|
|
MDSlider
|
|
id: telemetry_request_interval
|
|
min: 1
|
|
max: 214
|
|
value: 150
|
|
sensitivity: "all"
|
|
hint: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "vertical"
|
|
spacing: dp(24)
|
|
size_hint_y: None
|
|
padding: [dp(0),dp(24),dp(0),dp(60)]
|
|
#height: dp(232)
|
|
height: self.minimum_height
|
|
|
|
MDTextField:
|
|
id: telemetry_collector
|
|
max_text_length: 32
|
|
hint_text: "Telemetry Collector LXMF Address"
|
|
text: ""
|
|
font_size: dp(24)
|
|
|
|
|
|
# MDRectangleFlatIconButton:
|
|
# id: telemetry_copy_button
|
|
# icon: "content-copy"
|
|
# text: "Copy Own Telemetry"
|
|
# padding: [dp(0), dp(14), dp(0), dp(14)]
|
|
# icon_size: dp(24)
|
|
# font_size: dp(16)
|
|
# size_hint: [1.0, None]
|
|
# on_release: root.delegate.telemetry_copy(self)
|
|
# disabled: False
|
|
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
height: self.minimum_height
|
|
spacing: dp(24)
|
|
|
|
MDRectangleFlatIconButton:
|
|
id: telemetry_send_update_button
|
|
icon: "upload-lock"
|
|
text: "Send Now"
|
|
padding: [dp(0), dp(14), dp(0), dp(14)]
|
|
icon_size: dp(24)
|
|
font_size: dp(16)
|
|
size_hint: [1.0, None]
|
|
on_release: root.app.telemetry_send_update(self)
|
|
disabled: False
|
|
|
|
MDRectangleFlatIconButton:
|
|
id: telemetry_request_button
|
|
icon: "arrow-down-bold-hexagon-outline"
|
|
text: "Request Now"
|
|
padding: [dp(0), dp(14), dp(0), dp(14)]
|
|
icon_size: dp(24)
|
|
font_size: dp(16)
|
|
size_hint: [1.0, None]
|
|
on_release: root.app.telemetry_request_action(self)
|
|
disabled: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
height: self.minimum_height
|
|
spacing: dp(24)
|
|
|
|
MDRectangleFlatIconButton:
|
|
id: telemetry_sensors_button
|
|
icon: "sun-thermometer-outline"
|
|
text: "Configure Sensors"
|
|
padding: [dp(0), dp(14), dp(0), dp(14)]
|
|
icon_size: dp(24)
|
|
font_size: dp(16)
|
|
size_hint: [1.0, None]
|
|
on_release: root.delegate.sensors_action(self)
|
|
disabled: False
|
|
|
|
MDRectangleFlatIconButton:
|
|
id: telemetry_own_button
|
|
icon: "database-eye-outline"
|
|
text: "Display Own"
|
|
padding: [dp(0), dp(14), dp(0), dp(14)]
|
|
icon_size: dp(24)
|
|
font_size: dp(16)
|
|
size_hint: [1.0, None]
|
|
on_release: root.app.map_display_own_telemetry(self)
|
|
disabled: False
|
|
|
|
|
|
|
|
MDLabel:
|
|
text: "Display Options"
|
|
font_style: "H6"
|
|
|
|
MDLabel:
|
|
id: telemetry_info4
|
|
markup: True
|
|
text: "\\nYou can customise the display style of your telemetry data when viewed by others, by setting an icon and color options. This is usually used by clients to display your telemetry entry on a map or in lists and overviews. If left unset, the receiver will decide how to display the data.\\n"
|
|
size_hint_y: None
|
|
text_size: self.width, None
|
|
height: self.texture_size[1]
|
|
|
|
MDBoxLayout:
|
|
orientation: "vertical"
|
|
size_hint_y: None
|
|
height: dp(112)
|
|
padding: [dp(0), dp(24), dp(0), dp(24)]
|
|
pos_hint: {"center_x": .5}
|
|
|
|
MDIconButton:
|
|
pos_hint: {"center_x": .5}
|
|
id: telemetry_icon_preview
|
|
icon: "account"
|
|
type: "large"
|
|
theme_icon_color: "Custom"
|
|
icon_color: [0, 0, 0, 1]
|
|
md_bg_color: [1, 1, 1, 1]
|
|
icon_size: dp(64)
|
|
size_hint_y: None
|
|
# width: dp(64)
|
|
height: dp(80)
|
|
on_release: root.delegate.icons_action(self)
|
|
|
|
|
|
MDRectangleFlatIconButton:
|
|
id: telemetry_icons_button
|
|
icon: "list-box-outline"
|
|
text: "Select From Available Icons"
|
|
padding: [dp(0), dp(14), dp(0), dp(14)]
|
|
icon_size: dp(24)
|
|
font_size: dp(16)
|
|
size_hint: [1.0, None]
|
|
on_release: root.delegate.icons_action(self)
|
|
disabled: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "vertical"
|
|
size_hint_y: None
|
|
padding: [dp(0),dp(24),dp(0),dp(60)]
|
|
height: self.minimum_height
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
height: self.minimum_height
|
|
spacing: dp(24)
|
|
|
|
MDRectangleFlatIconButton:
|
|
id: telemetry_icons_button
|
|
icon: "list-box-outline"
|
|
text: "Set Foreground Color"
|
|
padding: [dp(0), dp(14), dp(0), dp(14)]
|
|
icon_size: dp(24)
|
|
font_size: dp(16)
|
|
size_hint: [1.0, None]
|
|
on_release: root.delegate.telemetry_fg_color(self)
|
|
disabled: False
|
|
|
|
MDRectangleFlatIconButton:
|
|
id: telemetry_icons_button
|
|
icon: "list-box-outline"
|
|
text: "Set Background Color"
|
|
padding: [dp(0), dp(14), dp(0), dp(14)]
|
|
icon_size: dp(24)
|
|
font_size: dp(16)
|
|
size_hint: [1.0, None]
|
|
on_release: root.delegate.telemetry_bg_color(self)
|
|
disabled: False
|
|
|
|
MDLabel:
|
|
text: "Advanced Configuration"
|
|
font_style: "H6"
|
|
|
|
MDLabel:
|
|
id: telemetry_info5
|
|
markup: True
|
|
text: "\\n[i]Read this section before enabling any advanced configuration options[/i]\\n\\nBy using the following options in combination with the basic settings above, it is possible to achieve a broad variety of telemetry collection, sharing and distribution systems. Both distributed, centralised, private and public configurations are possible. This section briefly explains the available options. For more details, refer to the full manual.\\n\\nIf the [b]Embed telemetry to all trusted[/b] option is enabled, Sideband will automatically embed telemetry data in outgoing messages to all peers marked as trusted.\\n\\nWith the [b]Sync all known telemetry to collector[/b] option enabled, Sideband will send not only its own, but all collected telemetry data to the specified collector address. This can be useful for aggregating data from many different areas onto collectors, and for distributed configurations.\\n\\nIf the [b]Always use propagation for telemetry[/b] option is enabled, Sideband will never attempt to directly delivery outbound telemetry, but will always send it via the active propagation node.\\n\\nThe [b]Try propagation if direct delivery fails[/b] option will make Sideband attempt to send outbound telemetry via the active propagation node, if direct delivery to the recipient fails.\\n\\nIf [b]Allow requests from all trusted[/b] is enabled, any peer marked as trusted will be able to perform requests on this Sideband instance.\\n\\n[b]Warning![/b] If the option [b]Allow requests from anyone[/b] is enabled, [i]any peer[/i], on [i]all reachable reticules[/i] will be able to query and access telemetry data stored on this instance. This can be very useful for emergency situations, rescue operations and public coordination, but should be used with [b]extreme caution[/b].\\n\\n[b]Requests[/b] enables remote peers to query telemetry data collected by this instance, and to run available statistics commands. Available commands are currently [b]ping[/b], which requests a small response message, [b]echo[/b] which requests an echo reply of the specified text, and [b]sig[/b] which requests a sigal report, if available.\\n"
|
|
size_hint_y: None
|
|
text_size: self.width, None
|
|
height: self.texture_size[1]
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Embed telemetry to all trusted"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_send_to_trusted
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Sync all known telemetry to collector"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_send_all_to_collector
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Always use propagation for telemetry"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_use_propagation_only
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Try propagation if direct delivery fails"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_try_propagation_on_fail
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Requests receive only latest"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_requests_only_send_latest
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Allow requests from all trusted"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_allow_requests_from_trusted
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Allow requests from anyone"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_allow_requests_from_anyone
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
|
|
"""
|
|
|
|
layout_sensors_screen = """
|
|
MDScreen:
|
|
name: "sensors_screen"
|
|
|
|
BoxLayout:
|
|
orientation: "vertical"
|
|
|
|
MDTopAppBar:
|
|
id: top_bar
|
|
title: "Sensors"
|
|
anchor_title: "left"
|
|
elevation: 0
|
|
left_action_items:
|
|
[['menu', lambda x: root.app.nav_drawer.set_state("open")]]
|
|
right_action_items:
|
|
[
|
|
['close', lambda x: root.app.close_sub_telemetry_action(self)],
|
|
]
|
|
|
|
MDScrollView:
|
|
id: sensors_scrollview
|
|
size_hint_x: 1
|
|
size_hint_y: None
|
|
size: [root.width, root.height-root.ids.top_bar.height]
|
|
do_scroll_x: False
|
|
do_scroll_y: True
|
|
|
|
MDGridLayout:
|
|
cols: 1
|
|
padding: [dp(28), dp(28), dp(28), dp(28)]
|
|
size_hint_y: None
|
|
height: self.minimum_height
|
|
|
|
MDLabel:
|
|
text: "Sensor Types"
|
|
font_style: "H6"
|
|
size_hint_y: None
|
|
height: self.texture_size[1]
|
|
|
|
MDLabel:
|
|
id: telemetry_info3
|
|
markup: True
|
|
text: ""
|
|
size_hint_y: None
|
|
height: self.texture_size[1]
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Location"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_s_location
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Battery State"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_s_battery
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Pressure"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_s_barometer
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Temperature"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_s_temperature
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Humidity"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_s_humidity
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Magnetic Field"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_s_compass
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Ambient Light"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_s_light
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Gravity"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_s_gravity
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Angular Velocity"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_s_gyroscope
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Acceleration"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_s_accelerometer
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Proximity"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_s_proximity
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Information"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_s_information
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
id: telemetry_information_fields
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
spacing: dp(16)
|
|
height: dp(64)
|
|
padding: [0, dp(0), 0, dp(0)]
|
|
|
|
MDTextField:
|
|
id: telemetry_s_information_text
|
|
size_hint: [1.0, None]
|
|
hint_text: "Custom information text"
|
|
max_text_length: 256
|
|
text: ""
|
|
font_size: dp(24)
|
|
|
|
MDBoxLayout:
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
padding: [0,0,dp(24),dp(0)]
|
|
height: dp(48)
|
|
|
|
MDLabel:
|
|
text: "Fixed Location"
|
|
font_style: "H6"
|
|
|
|
MDSwitch:
|
|
id: telemetry_s_fixed_location
|
|
pos_hint: {"center_y": 0.3}
|
|
active: False
|
|
|
|
MDBoxLayout:
|
|
id: telemetry_fixed_location_fields
|
|
orientation: "horizontal"
|
|
size_hint_y: None
|
|
spacing: dp(16)
|
|
height: dp(64)
|
|
padding: [0, dp(0), 0, dp(0)]
|
|
# md_bg_color: [1,0,0,1]
|
|
|
|
MDTextField:
|
|
id: telemetry_s_fixed_latlon
|
|
size_hint: [0.618, None]
|
|
hint_text: "Latitude, longtitude"
|
|
text: ""
|
|
font_size: dp(24)
|
|
|
|
MDTextField:
|
|
id: telemetry_s_fixed_altitude
|
|
size_hint: [0.382, None]
|
|
hint_text: "Altitude"
|
|
text: ""
|
|
font_size: dp(24)
|
|
|
|
"""
|
|
|
|
layout_icons_screen = """
|
|
MDScreen:
|
|
name: "icons_screen"
|
|
|
|
BoxLayout:
|
|
orientation: "vertical"
|
|
|
|
MDTopAppBar:
|
|
title: "Available Icons"
|
|
anchor_title: "left"
|
|
elevation: 0
|
|
left_action_items:
|
|
[['menu', lambda x: root.app.nav_drawer.set_state("open")]]
|
|
right_action_items:
|
|
[
|
|
['close', lambda x: root.app.close_sub_telemetry_action(self)],
|
|
]
|
|
|
|
MDBoxLayout:
|
|
orientation: 'vertical'
|
|
spacing: dp(10)
|
|
padding: dp(20)
|
|
|
|
MDBoxLayout:
|
|
adaptive_height: True
|
|
|
|
MDIconButton:
|
|
icon: 'magnify'
|
|
|
|
MDTextField:
|
|
id: icons_search_field
|
|
hint_text: 'Search icon'
|
|
on_text: root.delegate.icons_filter(self.text, True)
|
|
|
|
RecycleView:
|
|
id: icons_rv
|
|
key_viewclass: 'viewclass'
|
|
key_size: 'height'
|
|
|
|
RecycleBoxLayout:
|
|
padding: dp(10)
|
|
default_size: None, dp(48)
|
|
default_size_hint: 1, None
|
|
size_hint_y: None
|
|
height: self.minimum_height
|
|
orientation: 'vertical'
|
|
""" |